excel-vba-loop

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop

ในที่สุดเราก็มาถึงบทที่จะใช้ความสามารถของการเขียนโปรแกรมกันอย่างเต็มที่กันซักที ซึ่งก็คือความสามารถในการวน 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
Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 1

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 ก็จะได้ผลลัพธ์ดังรูป

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 2
  • 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 ย่อยๆ หลายๆ อันเหมือนกันนะ

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 3

แบบนี้มันจะวน 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 ขึ้นมาได้อย่างถูกต้องเลย

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 4

การออกจาก 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 ยังไม่ออก)

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 5

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
Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 6

แบบนี้พอมันเช็คว่าค่าใน 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% นะ แต่ละช่องจะเล็กมากๆ เลย)

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 7

ถ้าเปลี่ยนไปรันตัว b แทนก็จะได้อีกสีนึง สวยดีเนอะ 555

Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop 8
อบรม In-House Training

Feedback การใช้งาน AI Chatbot