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.

test php

banquyen pngBài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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:

single loop png

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:

double loop png

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:

bang chuong nhan gif

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

vib if else statement JPG

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ả:

do while loop png

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ả:

advanced do while loop png

Đặ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.

Từ khóa » Cấu Trúc Vòng Lặp Vba