Các vòng lặp trong VBA: Vòng lặp For và Do While - ự học Excel VBA
Trong bài này chúng ta sẽ tìm hiểu về các vòng lặp trong VBA như: vòng lặp For, vòng lặp Do While, vòng lặp Do Until, vòng lặp For Each. Kèm theo đó là những ví dụ đơn giản nhất. Vòng lặp là một trong những kỹ thuật mạnh mẽ nhất của các ngôn ngữ lập trình. Vòng lặp trong Excel VBA cho phép bạn ...
Trong bài này chúng ta sẽ tìm hiểu về các vòng lặp trong VBA như: vòng lặp For, vòng lặp Do While, vòng lặp Do Until, vòng lặp For Each. Kèm theo đó là những ví dụ đơn giản nhất.
Vòng lặp là một trong những kỹ thuật mạnh mẽ nhất của các ngôn ngữ lập trình. Vòng lặp trong Excel VBA cho phép bạn lặp qua một dải ô chỉ với một vài dòng code.
1. Vòng lặp For trong VBA
Vòng lặp For đơn giản
Vòng lặp For được dùng trong trường hợp biết trước tổng số lần lặp.
Bước nhảy ở vòng lặp for là 1 đơn vị.
Cú pháp của vòng lặp For tương đối đơn giản.
Dim i As Integer
For i = 1 To 6
Cells(i, 1).Value = 100
Next iĐoạn code này sẽ gán giá trị 100 cho các ô từ A1 đến A6. Kêt quả chạy chương trình này sẽ như sau:

Mình sẽ giải thích một chút nhé.
For i = 1 To 6có nghĩa là lặp 6 lần (1,2,3,4,5,6)Cells(i, 1).Value = 100sẽ gán giá trị 100 cho ô trong lần lặp đó.- Lần 1: i = 1 nên Cells(1, 1).Value = 100
- Lần 2: i = 2 nên Cells(2, 1).Value = 100
- Lần 3: i = 3 nên Cells(3, 1).Value = 100
- Lần 4: i = 4 nên Cells(4, 1).Value = 100
- Lần 5: i = 5 nên Cells(5, 1).Value = 100
Next ilà cú pháp bắt buộc. Biến i chính là biến điều khiển vòng lặp.
Vòng lặp For lồng nhau
Bạn có thể sử dụng vòng lặp For lồng nhau để lặp qua một dãy gồm nhiều ô và nhiều cột.
Ví dụ: Gán giá trị 100 cho các ô từ A1 đến B6.
Dim i As Integer, j As Integer
For i = 1 To 6
For j = 1 To 2
Cells(i, j).Value = 100
Next j
Next iVòng lặp bên ngoài sẽ lặp 6 lần, và mỗi lần lặp nó sẽ lặp 2 lần ở vòng lặp con bên trong.
Kết quả như sau:

For Loop Step
Step chính lá giá trị bước nhảy của vòng lặp.
Sub ForEach_CountTo10_Even()
Dim n As Integer
For n = 2 To 10 Step 2
MsgBox n
Next n
End Sub
- Mặc định của Step là bằng 1 nên những vòng lặp bạn truyền step thì đó là vòng lặp có bước nhảy tăng 1 đơn vị.
- Nếu bạn muốn thực hiện vòng lặp giảm thì hãy thiết lập step là số âm.
Ví dụ 1: Lặp từu 10 đến 1.
Sub ForEach_Countdown_Inverse()
Dim n As Integer
For n = 10 To 1 Step -1
MsgBox n
Next n
MsgBox "Lift Off"
End Sub
Ví dụ 2: Sử dụng vòng lặp lồng nhau để in ra bảng cửu chương nhân.
Sub Nested_ForEach_MultiplicationTable()
Dim row As Integer, col As Integer
For row = 1 To 9
For col = 1 To 9
Cells(row + 1, col + 1).Value = row * col
Next col
Next row
End Sub
Kết quả sẽ có dạng như sau:

Exit For
Đây là lệnh dùng để dừng vòng lặp For ngay lập tức. Khi gặp lệnh này thì dù điều kiện dúng hay sai nó cũng sẽ kết thúc vòng lặp, kể cả những đoạn code còn chưa chạy ở phía dưới cũng không thực thi.
Ví dụ dưới đây sẽ lặp các ô A1 đến A1000, nếu gặp ô nào có giá trị "error" thì xuất thông báo và kết thúc vòng lặp.
Sub ExitFor_Loop()
Dim i As Integer
For i = 1 To 1000
If Range("A" & i).Value = "error" Then
Range("A" & i).Select
MsgBox "Error Found"
Exit For
End If
Next i
End Sub
Continue For
Đây là lệnh bỏ qua lần lặp hiện tại và nhảy tới lần lặp kế tiếp. Khi gặp lệnh này thì trình biên dịch sẽ bỏ qua những đoạn code phía dưới của lần lặp hiện tại, sau đó kiểm tra điều kiện lặp và lặp cho lần lặp kế tiếp.
Cách dùng nó nhưu lệnh Exit For.
2. Vòng lặp For Each trong VBA
Vòng lặp For Each sẽ lặp qua từng phần tử của một danh sách (collection), thường sẽ là:
- Các ô trong Excel
- Các biểu đồ trong Sheet
- Các Sheet
- Các ô trong một vùng chọn
- ...
Cú pháp của nó như sau:
For Each Object in Collection
[Do Something]
Next [Object]Trong đó:
- Object là biến tạm dùng để chứa phần tử của mỗi lần lặp
- Colection là danh sách đối tượng cần lặp
- Do something là chương trình chính cho vòng lặp
- Next Object là lệnh đóng vòng lặp
Vòng lặp For Each được sử dụng để lăp qua các phần tử của một danh sách, chẳng hạn như một dãy các trang tính, dãy các ô hoặc một dãy các số tự nhiên.
Ví dụ 1: Lặp qua tất cả các bảng tính trong Workbook
Đoạn code này sẽ lặp qua tất cả các trang tính trong và hiển thị chúng:
Sub LoopThroughSheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Visible = True
Next
End SubVí dụ 2: Lặp qua tất cả các ô trong một phạm vi (Range)
Đoạn code này sẽ lặp qua một tất cả các ô trong mộ phạm vi, kiểm tra xem giá trị của ô là âm hay dương:
Sub If_Loop()
Dim Cell as Range
For Each Cell In Range("A2:A6")
If Cell.Value > 0 Then
Cell.Offset(0, 1).Value = "Positive"
ElseIf Cell.Value < 0 Then
Cell.Offset(0, 1).Value = "Negative"
Else
Cell.Offset(0, 1).Value = "Zero"
End If
Next Cell
End Sub
Ví dụ 3: Lặp qua các cell từ A1 đến A10
Sub ForEachCell_inRange()
Dim cell As Range
For Each cell In Range("a1:a10")
cell.Value = cell.Offset(0, 1).Value
Next cell
End Sub
Ví dụ 4: Lặp qua từng sheet và loải bỏ tính năng mật khẩu bảo vệ.
Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Unprotect "password"
Next ws
End Sub
Ví dụ 5: Lặp qua những workbook đang ở trạng thái open.
Sub ForEachWB_inWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close SaveChanges:=True
Next wb
End Sub
Ví dụ 6: Lặp qua các Shape trong Sheet đang active.
Sub ForEachShape()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp
End Sub
Ví dụ 7: Kết hợp lệnh If Then
Sub ForEachCell_inRange()
Dim cell As Range
For Each cell In Range("a1:a10")
If cell.Value = "" Then _
cell.EntireRow.Hidden = True
Next cell
End Sub
3. Vòng lặp Do While trong VBA
Nếu vòng lặp For dùng để lặp trong trường hợp biết trước tổng số lần lặp thì vòng lặp Do While lại khác, ta sẽ dùng nó trong trường hợp không biết trước tổng số lần lặp.
Đặt điều kiện ở trên
Cú pháp của nó như sau:
Do condition // statements Loop
Trong đó statements chính là những đoạn code được chạy nếu condition = true.
Bạn phải chú ý là trong các lệnh ở statements phải có trường hợp đưa ra nhưng điều kiện sai để dừng vòng lặp, nếu không sẽ dẫn đến lặp vô hạn.
Ví dụ 1: Gán giá trị 20 cho các ô từ A1 đến A5.
Dim i As Integer
i = 1
Do While i < 6
Cells(i, 1).Value = 20
i = i + 1
LoopKết quả:

Ví dụ 2: Gán giá trị của các ô từ B1 đến B5, giá trị được lấy từ cột A tương ứng và cộng thêm 10 đơn vị.
Dim i As Integer
i = 1
Do While Cells(i, 1).Value <> ""
Cells(i, 2).Value = Cells(i, 1).Value + 10
i = i + 1
LoopKết quả:

Đặt điều kiện ở cuối
Bạn có thể thay đổi biến thể của Do While bằng cách đặt điều kiện ở cuối.
Do ' statement Loop While Condition
Ví dụ: Lặp từ 1 đến 10.
Sub DoLoopWhile()
Dim n As Integer
n = 1
Do
MsgBox n
n = n + 1
Loop While n < 11
End Sub4. Vòng lặp Do Until trong VBA
Đặt điều kiện ở đầu bài
Vòng lặp Do Until sẽ lặp cho đến khi điều kiện được đáp ứng. Cú pháp về cơ bản giống như các vòng lặp Do While:
Do Until Condition
[Do Something]
LoopVí dụ:
Sub DoUntilLoop()
Dim n As Integer
n = 1
Do Until n > 10
MsgBox n
n = n + 1
Loop
End SubĐặt điều kiện ở cuối bài
Và tương tự, bạn cũng có thể đặt condition ở cuối.
Do
[Do Something]
Loop Until ConditionVí dụ
Sub DoLoopUntil()
Dim n As Integer
n = 1
Do
MsgBox n
n = n + 1
Loop Until n > 10
End SubExit Do
Lệnh này có công dụng tương tự lệnh Exit For, tức là nó sẽ nhảy ra khỏi vòng lặp ngay lập tức.
Ví dụ: Viết lại ví dụ ở phần Exit For.
Sub ExitDo_Loop()
Dim i As Integer
i = 1
Do Until i > 1000
If Range("A" & i).Value = "error" Then
Range("A" & i).Select
MsgBox "Error Found"
Exit Do
End If
i = i + 1
Loop
End SubTrên là cách sử dụng vòng lặp trong VBA như: Vòng lặp For, Do While, Do Until, For Each.