ในที่สุดเราก็มาถึงบทที่จะใช้ความสามารถของการเขียนโปรแกรมกันอย่างเต็มที่กันซักที ซึ่งก็คือความสามารถในการวน Loop นั่นเองครับ เรามาดูกันมามีเรื่องอะไรที่ควรจะต้องรู้บ้าง
สารบัญ
การวน Loop คืออะไร?
การวน Loop คือการสั่งให้ Run Code อะไรบางอย่างหลายๆ รอบ ซึ่งแต่ละรอบอาจจะมีอะไรบางอย่างเปลี่ยนไปก็ได้นะ
เช่น ถ้าเราอยากให้ Excel สร้าง Sheet ใหม่ขึ้นมา เราสามารถใช้คำสั่ง Worksheets.Add ได้เลย
และถ้าเราอยากให้ทำแบบนี้ 5 รอบล่ะ?
เราก็ทำแบบนี้ได้
Worksheets.Add
Worksheets.Add
Worksheets.Add
Worksheets.Add
Worksheets.Add
แต่มันไม่เท่เลย เพราะ Maintain แก้ Code ยาก แถมเหนื่อยด้วยถ้าต้องทำเยอะๆ หรือ code เรามีมากกว่า 1 คำสั่ง เป็นต้น
ดังนั้นเราจะใช้การวน Loop มาช่วยก็ได้ครับ จะได้ไม่ต้องเขียนอะไรซ้ำๆ หลายๆ รอบไงล่ะ
การอ้างอิง Cell ด้วยตัวเลข
การจะใช้ Loop ได้ดี เราควรจะรู้จักวิธีการอ้างอิง Cell อีกแบบนึงก่อน ที่ใช้ตัวเลขมาช่วยแทนที่จะเป็นชื่อ นั่นเป็นเพราะเลขทำให้วน Loop ได้ง่ายยังไงล่ะ
วิธีการอ้างอิง Cell เดียว
สามารถใช้ การอ้างอิงด้วย Cells เพื่ออ้างอิง Range ด้วยตัวเลขได้ ในรูปแบบของ Cells(เลขแถว, เลขคอลัมน์)
Tips : เวลา Excel อ้างอิงเลขแถว/เลขคอลัมน์ มักจะอ้างอิงแถวก่อนคอลัมน์เสมอ (Row ก่อน Column) ลองสังเกตดูได้ ไม่ว่าจะใส่สูตร Index, Offset หรือพวก Matrix ก็เป็นแบบนั้น
Cells(3,2).Select
แบบนี้มีค่าเท่ากับ Range(“B3”).Select
ถ้าจะอ้างอิงเป็นช่วง
เราสามารถสามารถใช้ Cells ผสมกับ Range ได้แบบนี้
Range( Cell เริ่มต้น, Cell สิ้นสุด)
Range( Cells(3,2), Cells(5,4)).Select
แบบนี้มีค่าเท่ากับ Range(“B3:D5”).Select
การเลื่อน Cell หรือ Offset ไปทิศต่างๆ
เราสามารถใส่ Property ที่ชื่อว่า Offset เพื่อเลื่อน Range ไปยังทิศต่างๆ ได้ ในรูปแบบของ
Range.Offset(จำนวนแถวที่จะเลื่อน,จำนวนคอลัมน์ที่จะเลื่อน)
เช่น
Range("A1:B3").Offset(4, 2).Select
For Loop
ใน VBA นั้นมี For Loop อยู่ 2 แบบ นั่นก็คือ For… Next กับ For Each เรามาดูทีละตัวกัน
For…Next
มีวิธีการใช้ คือ
For Counter = เลขเริ่ม To เลขจบ
Code คำสั่งที่จะให้ Run ซ้ำๆ
Next Counter
'Counter จะเป็นตัวแปรชื่ออะไรก็ได้ ปกติชอบใช้ i กัน
เช่น
For i = 1 To 5
Worksheets.Add
Next i
แบบนี้ก็จะมีการรัน Worksheets.Add จำนวน 5 ครั้ง นั่นเอง
ซึ่งใน Code ที่รัน เรามักจะเอา Counter มาทำอะไรซักอย่างด้วย เช่น ใช้ประกอบกับ Cells(เลขแถว,เลขคอลัมน์) แบบนี้
For i = 1 To 5
Cells(i, 1) = i * 10
Next i
เมื่อ Run ก็จะได้ผลลัพธ์ดังรูป
- Loop ที่ 1 i เป็น 1 ก็จะรันคำสั่ง Cells(1,1) = 1*10
- Loop ที่ 2 i เป็น 2 ก็จะรันคำสั่ง Cells(2,1) = 2*10
- ….
- Loop ที่ 5 i เป็น 5 ก็จะรันคำสั่ง Cells(5,1) = 5*10
For Each … Next
สำหรับ For Loop อีกแบบ จะเป็นการวน Loop เท่ากับจำนวนสมาชิกตัวลูกที่อยู่ใน Collection นั้นๆ ในรูปแบบดังนี้
For Each element In collection
Code คำสั่งที่จะให้ Run ซ้ำๆ
Next element
เช่น
หากเราเลือก Range ไว้หลายช่อง จริงๆ แล้ว Range ที่เลือกก็เป็น Collection ที่ประกอบไปด้วย Range ย่อยๆ หลายๆ อันเหมือนกันนะ
แบบนี้มันจะวน Loop จนครบสมาชิกทุกอันของ Selection ได้เลย ว่าในแต่ละ cell อยู่แถวเลขอะไร โดยที่เราไม่ต้องมานับเองว่ามันมีกี่อัน ซึ่งมีประโยชน์มากๆ ในชีวิตจริง โดยส่วนตัวเป็นรูปแบบ Loop ที่ผมชอบมากที่สุดเลยล่ะ
การประกาศตัวแปรให้ชัดเจน ทำให้เขียน Code ง่ายขึ้น
ถ้าเขียน Code แบบตัวอย่างก่อนหน้า Excel จะยังไม่รู้ว่า c คือ element อะไร ทำให้ไม่มี ToolTips ขึ้นมาช่วย ถ้าให้ดีเราต้องบอกมันนิดนึง ด้วยการประกาศตัวแปร ในรูปแบบว่า
Dim ตัวแปร as ประเภทข้อมูล
เช่น
Dim c As Range
For Each c In Selection
c.Value = c.Row
Next c
พอประกาศตัวแปรชัดเจนแล้ว จะทำให้ตัว Tool Tips ขึ้นมาได้อย่างถูกต้องเลย
การออกจาก For
เราสามารถออกจาก For ได้โดยการใช้คำสั่ง Exit For ซึ่งมักใช้ผสมกับคำสั่ง If เช่น
Sub Macro3()
Dim c As Range
For Each c In Selection
If c.Value > 30 Then
Exit For
Else
c.Font.Color = RGB(255, 0, 0)
End If
Next c
End Sub
มันก็จะ Loop ไปเรื่อยๆ ที่ละ Range แต่พอไปเจอว่าค่ามากกว่า 30 ก็ออกจาก Loop For ทันที (30 ยังไม่ออก)
Do While Loop
ต่อไปก็เป็น Loop อีกประเภทนึงที่ควรรู้จัก นั่นก็คือ การทำอะไรบางอย่างในขณะที่เงื่อนไขยังคงเป็นจริงอยู่ ในรูปแบบว่า
Do While เงื่อนไข
Code คำสั่งที่จะให้ Run ซ้ำๆ
Loop
ซึ่งมีการเช็คเงื่อนไขบางอย่างก่อน กรณีที่เงื่อนไขเป็นจริงจะทำ Action ตามที่เรากำหนด แล้วก็กลับไปเช็คเงื่อนไขใหม่อีกครั้ง เช่น
Sub Macro3()
Range("A1").Select
Do While ActiveCell.Value < 35
ActiveCell.Font.Color = RGB(0, 0, 255)
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
แบบนี้พอมันเช็คว่าค่าใน A4 (ที่เป็น ActiveCell ใน Loop นั้น) ไม่ได้น้อยกว่า 35 มันก็ออกจาก Loop เลย ไม่ได้เปลี่ยนให้เป็นสีฟ้า
Tips : ส่วนการออกจาก Do While ก็สามารถใช้ Exit Do ได้ครับ
จริงๆ ยังมี Loop แบบอื่นอีก แต่พอแล้วล่ะ
จริงๆ ยังมี Loop แบบอื่นอีก แต่ผมคิดว่าไม่จำเป็นหรอก เราใช้ Loop แค่ 3 แบบนี้ก็เหลือแหล่แล้วครับ
ใน Python ก็มีแค่ For กับ While ยังทำงานได้เลย ^^
ตัวอย่างการใช้ Loop
ลอง Fill สี R G ไล่ 1 ถึง 255 ส่วน B เป็น 0 ไป ลงไปใน Cell แบบสวยงาม
ใน Code จะเห้นว่าเราสามารถใส่ For Loop 2 ชั้นซ้อนกันก็ได้นะ แต่ใช้ Counter คนละตัว ซึ่งผมใช้ r กับ g อย่างละ 255
Sub Macro3()
Range("A1").Select
Application.ScreenUpdating = False
For r = 1 To 255
For g = 1 To 255
Cells(r, g).Interior.Color = RGB(r, g, 0)
Next g
Next r
Application.ScreenUpdating = True
End Sub
Tips : เราใส่ Application.ScreenUpdating = False เพื่อปิดการแสดงผลจนกว่าจะทำเสร็จ ค่อยทำให้เป็น True ไม่งั้นมันจะ Run นานมาก เพราะต้องรันไปแสดงผลไป (การทำแบบนี้จะเร็วขึ้นมากๆ ผมลองแล้วเร็วกว่ากัน 10 เท่า++ ได้)
จะได้ผลลัพธ์แบบนี้ (ผม Zoom Out ออกมาให้ เหลือแค่ 10% นะ แต่ละช่องจะเล็กมากๆ เลย)
ถ้าเปลี่ยนไปรันตัว b แทนก็จะได้อีกสีนึง สวยดีเนอะ 555