---
title: "Excel VBA พื้นฐาน ตอนที่ 3 : การวน Loop"
url: https://www.thepexcel.com/excel-vba-basic-03-loop/
type: post
date: 2020-05-11
updated: 2022-04-24
author: Sira Ekabut
categories: [Excel VBA]
tags: [loop, for, while]
---

# 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
```

 ![1](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-012.png) 

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

 ![2](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-001.png) 
- 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 ย่อยๆ หลายๆ อันเหมือนกันนะ

 ![3](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-002.png) 

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

 ![4](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-003-1024x388.png) 

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

 ![5](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-005.png) 

## 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
```

 ![6](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-008.png) 

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

 ![7](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-010-1024x543.png) 

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

 ![8](https://www.thepexcel.com/wp-content/uploads/2020/05/vba-basic3-011-1024x526.png)

---

_Source: [https://www.thepexcel.com/excel-vba-basic-03-loop/](https://www.thepexcel.com/excel-vba-basic-03-loop/)_
