06/04/2021, 14:51

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:

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.

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

Cùng chủ đề
0