Các vòng lặp trong VBA: Vòng lặp For và Do While
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ị.
Bài viết này được đăng tại [free tuts .net]
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 6
có nghĩa là lặp 6 lần (1,2,3,4,5,6)Cells(i, 1).Value = 100
sẽ 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 i
là 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 i
Vò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 Sub
Ví 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 Loop
Kế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 Loop
Kế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 Sub
4. 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] Loop
Ví 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 Condition
Ví dụ
Sub DoLoopUntil() Dim n As Integer n = 1 Do MsgBox n n = n + 1 Loop Until n > 10 End Sub
Exit 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 Sub
Trê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.