บทที่ 3 การพัฒนาโปรแกรมโดยเขียนคำสั่ง VBA อ.สุรินทร์ทิพ ศักดิ์ภูวดล สำนักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลข
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลข (1) 1. ไปที่ Cell B3 2. กำหนดค่าตัวแปร Address ไว้ในตัวแปร FirstCell 3. ให้เลื่อนไปทำงานที่ Cell ล่างสุด (กดปุ่ม End > กดปุ่มลูกศรลง) 4. กำหนดค่า Address ไว้ในตัวแปร LastCell 5. กำหนดช่วงไว้ในตัวแปร CellRange 6. ให้เลื่อนลง 1 Cell (กดปุ่มลูกศรลง) เพื่อกำหนดสูตร 7. ตั้งสูตร Sum ของช่วง ตั้งแต่ FirstCell ถึง LastCell
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลข (2)
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลข (3) ขั้นตอนเขียนโปรแกรม 1. เรียก Excel ขึ้นมาแล้วป้อนข้อมูล ดังรูป 2. เริ่มเขียน โปรแกรมบน Excel สามารถเข้าสู่ Visual Basic โดยกด Alt+F11 3. Insert Module 4. ตั้งชื่อ Procedure เป็น “SumAmount” 5. พิมพ์คำสั่งดังต่อไปนี้ Sub SumAmount() Range("B3").Select firstcell = ActiveCell.Address Selection.End(xlDown).Select lastcell = ActiveCell.Address cellrange = firstcell & ":" & lastcell ActiveCell.Offset(1, 0).Select ActiveCell.Formula = "=Sum(" & cellrange & ")" End Sub 6. กลับไปยัง Excel สามารถกด Alt+F11 7. สร้างปุ่มให้กับ Procedure SumAmount เพื่อให้โปรแกรมทำงานตามคำสั่งที่เขียนไว้
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลข (4) หมายเหตุ : ActiveCell.Formula = "=Sum (" & MyRange & ")" สามารถแยกทำความเข้าใจดังนี้ 1. "=Sum (" ให้ทำการรวม = Sum( 2. & เชื่อมกับ… 3. MyRange ค่าที่อยู่ในตัวแปร MyRange 4. & เชื่อมกับ… 5. ")" ) หลังจาก Run จะได้ค่าที่โปรแกรมเข้าใจเช่น = SUM(C3:C7)
แบบฝึกหัด ให้เริ่มที่ตำแหน่ง G2 ให้แสดงผลการรวมที่ตำแหน่งที่ห่างจากบรรทัดสุดท้ายของข้อมูลออกไปเป็น (2,2) โดยแก้ไขดังนี้ ActiveCell.Offset(2,2).Select ในบรรทัดที่ 6
การเขียนโปรแกรม เพื่อหาผลรวมของตัวเลขหลาย Column
คำสั่งสำคัญ การอ้างถึงที่อยู่ของ Cell ในรูปแบบ Absolute Address จะมี $ ปรากฏทั้งแนว Row และแนว Column (ค่าที่มี $ กำกับเมื่อทำงานจะมองที่ Cell เดิมไม่เปลี่ยนตำแหน่งใหม่) เช่น Firstcell = ActiveCell.Address = $C$3 ซึ่งหากมีการนำค่าที่อยู่ในช่วงตำแหน่งนี้ไปคำนวณ เช่น หาผลรวมเป็นช่วง =SUM($C$3:$C$7) จะพบว่า ไม่ว่าเราจะทำการเลือก Cell อื่นเพื่อทำการ Copy สูตร สูตรจะยังคงคำนวณจากค่าที่อยู่ Column เดิมคือช่วง C3 ถึง C7 เท่านั้น การอ้างถึงที่อยู่ของ Cell ในรูปแบบ Relative Address เช่น Firstcell = ActiveCell.Address(False, False) = C3 ซึ่งหากมีการนำค่าที่อยู่ในช่วงตำแหน่งนี้ไปคำนวณ เช่น หาผลรวมเป็นช่วง =SUM(C3:C7) เราจะพบว่า เมื่อเราจะทำการเลือก Cell อื่นเพื่อทำการ Copy สูตร สูตรจะเปลี่ยนไปตาม Column ที่เปลี่ยนไป เป็น SUM(D3:D7), SUM(E3:E7) …
ขั้นตอนการทำงาน 1. ไปที่ Cell B3 2. กำหนดค่าตัวแปร Address ไว้ในตัวแปร FirstCell 3. เลื่อนมาล่างสุดของข้อมูล (กดปุ่ม End > กดปุ่มลูกศรลง) 4. กำหนดค่า Address ไว้ในตัวแปร LastCell 5. เลื่อนไปทางขวาสุดของข้อมูล (กดปุ่ม End > กดปุ่มลูกศรไปทางขวา) 6. เลื่อนลง (กดปุ่มลูกศรลง) 7. กำหนดค่า Address ไว้ในตัวแปร LastFormula 8. เลื่อนไปทางซ้ายมือสุด (กดปุ่ม End แล้วกดลูกศรไปทางซ้าย) 9. เลื่อนไปทางขวามือ 1 cell 10. กำหนดค่า Address ไว้ในตัวแปร FirstFormula 11. ระบายตั้งแต่ FirstFormula จนถึง LastFormula 12. กำหนดสูตร หาผลรวมตั้งแต่ FirstCell ถึง LastCell
กำหนดข้อมูลดังนี้
ขั้นตอนการเขียนโปรแกรม ให้สร้าง Procedure ดังนี้ และสร้างปุ่มเรียกใช้ Procedure Sub SumAmount_02() Range("C3").Select Firstcell = ActiveCell.Address(False, False) Selection.End(xlDown).Select lastcell = ActiveCell.Address(False, False) Selection.End(xlToRight).Select Datarange = Firstcell & ":" & lastcell ActiveCell.Offset(1, 0).Select LastFormula = ActiveCell.Address Selection.End(xlToLeft).Select ActiveCell.Offset(0, 1).Select FirstFormula = ActiveCell.Address FormulaArea= FirstFormula & ":" & LastFormula Range(FormulaArea).Select Selection.Formula = "=Sum(" & Datarange & ")" End Sub
แบบฝึกหัด ให้ลองเปลี่ยนคำสั่งใน Procedure ดังนี้ และสร้างปุ่มเรียกใช้ Procedure Sub SumAmount_02() Range("C3").Select Firstcell = ActiveCell.Address(True, True) Selection.End(xlDown).Select lastcell = ActiveCell.Address(True, True) Selection.End(xlToRight).Select Datarange = Firstcell & ":" & lastcell ActiveCell.Offset(1, 0).Select LastFormula = ActiveCell.Address Selection.End(xlToLeft).Select ActiveCell.Offset(0, 2).Select FirstFormula = ActiveCell.Address FormulaArea= FirstFormula & ":" & LastFormula Range(FormulaArea).Select Selection.Formula = "=Sum(" & Datarange & ")" End Sub
คำสั่ง กรณีนี้ตัวแปร DataRange ควรจะเป็น Relative เสมอ เพื่อให้สูตรมีการเปลี่ยนแปลงตามที่ควรจะเป็น ดูค่าที่เปลี่ยนไปจากแบบฝึกหัด ActiveCell.Formula คือ การตั้งสูตรไว้ใน Cell ที่อยู่ เป็นการกำหนดสูตรให้กับ Cell ที่กำลัง Active เพียง Cell เดียว Selection.Formula คือ การกำหนดสูตรให้กับบริเวณที่เลือกระบายไว้ทั้งหมดทุก Cell
แบบฝึกหัด นิสิตไม่ต้องพิมพ์ สามารถ Copy Code ไปใส่ใน Program แล้ว Run คำสั่งเพื่อศึกษาการทำงาน
สร้างตารางตามแบบฝึกหัด
เขียนโปรแกรม จากนั้นสร้างปุ่ม Test Range_01 ให้กับชุดคำสั่ง TestRange_01 คำสั่ง แสดงที่อยู่ของ Cell ในรูปแบบ Absolute Address จะมี $ ปรากฏทั้งแนว Row และแนว Column เช่น Firstcell = ActiveCell.Address Sub TestRange_01() Range("B3").Select Firstcell = ActiveCell.Address Selection.End(xlDown).Select Selection.End(xlToRight).Select lastcell = ActiveCell.Address Cellrange = Firstcell & ":" & lastcell MsgBox Cellrange End Sub
เขียนโปรแกรม จากนั้นสร้างปุ่ม Test Range_02 ให้กับชุดคำสั่ง TestRange_02 คำสั่งแสดงที่อยู่ของ Cell ในรูปแบบ Relative Address เช่น Firstcell = ActiveCell.Address(False, False) Sub TestRange_02() Range("B3").Select Firstcell = ActiveCell.Address(False, False) Selection.End(xlDown).Select Selection.End(xlToRight).Select lastcell = ActiveCell.Address(False, False) Cellrange = Firstcell & ":" & lastcell MsgBox Cellrange End Sub
แบบฝึกหัดในห้องเรียนให้นิสิตสร้าง Procedure เพิ่มซึ่งสามารถคำนวณผลรวมตามแนวนอนได้ ดังรูป