31.7 C
Ho Chi Minh City
Thursday, June 4, 2026
AIPHOGPT.COM
Trang chủCông thức ExcelVòng lặp VBA – For, For Each, Do While và Do Until

Vòng lặp VBA – For, For Each, Do While và Do Until

Join LeQuocThai.Com on Telegram Channel

Đánh giá lequocthai.com:

0 / 5 Voted: 0 Votes: 0

Your page rank:

  • For Loop
  • For Each Loop
  • Do While Loop
  • Do Until Loop
  • Wend Loop (đã lỗi thời)

Trong bài viết này, mình sẽ giải thích chi tiết các vòng lặp VBA kèm theo ví dụ. Trước khi vào phần thực tế, hãy cùng hiểu vòng lặp là gì và vì sao chúng được dùng.

Vòng lặp là gì và công dụng của nó?

Vòng lặp là một câu lệnh cho phép thực thi một nhóm câu lệnh liên tục cho đến khi thỏa mãn một điều kiện nào đó.

Vòng lặp có thể:

  • Lặp lại một nhóm câu lệnh.
  • Kiểm tra một điều kiện nhiều lần.
  • Tạo logic ngủ (sleep) và chờ (wait) tùy chỉnh trong mã.

VBA FOR LOOP

For Loop (còn gọi là “For Next Loop”) là một trong những vòng lặp quan trọng và được sử dụng nhiều nhất trong VBA. Nó cho phép lặp lại một nhóm câu lệnh một số lần xác định.

Cú pháp của VBA For Loop

For loop_ctr = start_num To end_num [step_increment]

'Statements to be executed inside the loop

Next loop_ctr

Trong đó, `loop_ctr` là biến đếm vòng lặp – xương sống của “For Next Loop”. Biến này sẽ tăng lên sau mỗi lần lặp cho tới khi vòng lặp kết thúc.

  • `start_num`: số bắt đầu.
  • `end_num`: số kết thúc.
  • `step_increment`: (tùy chọn) mức tăng của `loop_ctr` sau mỗi vòng lặp; mặc định là 1.

Vòng lặp For hoạt động như thế nào?

Ví dụ:

For loop_ctr = 1 To 100

'Statements to be executed inside the loop

Next loop_ctr

Khi gặp lệnh `For loop_ctr = 1 To 100`, VBA cấp bộ nhớ cho `loop_ctr` và khởi tạo giá trị 1. Sau đó thực thi các câu lệnh trong vòng For. Khi đến `Next loop_ctr`, `loop_ctr` tăng lên 1 và VBA quay lại kiểm tra `loop_ctr` có đạt 100 chưa. Nếu chưa, vòng lặp tiếp tục; nếu đã, dừng.

Một vài ví dụ đơn giản về For Loop trong VBA

Ví dụ 1: In ra các số từ 1 đến 10 trong Excel.

Sub ForLoopPrintNumbers()

Dim loop_ctr As Integer

For loop_ctr = 1 To 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Giải thích: Đầu tiên khai báo biến đếm `loop_ctr`. Khi lệnh `For` chạy, `loop_ctr` bắt đầu bằng 1 và dừng ở 10. Trong thân vòng, giá trị `loop_ctr` được ghi vào cột A. Vì không chỉ định `step_increment`, mỗi lần lặp `loop_ctr` tăng 1, nên vòng chạy 10 lần và điền số 1‑10 vào A1:A10.

Ví dụ 2: Tính tổng các số từ 1 đến 10.

Sub ForLoopSumNumbers()

Dim loop_ctr As Integer

Dim result As Integer

result = 0

For loop_ctr = 1 To 10

result = result + loop_ctr

Next loop_ctr

MsgBox "Sum of numbers from 1-10 is : " & result

End Sub

Giải thích: Tương tự ví dụ trước, nhưng mỗi vòng lặp cộng `loop_ctr` vào biến `result`. Khi vòng For kết thúc, `result` chứa tổng 1‑10 và được hiển thị.

Ví dụ 3: In ra các số chẵn từ 1 đến 10.

Sub ForLoopToPrintEvenNumbers()

Dim loop_ctr As Integer

Dim cell As Integer

cell = 1

For loop_ctr = 1 To 10

If loop_ctr Mod 2 = 0 Then

ActiveSheet.Range("A1").Offset(cell - 1, 0).Value = loop_ctr

cell = cell + 1

End If

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Giải thích: Kiểm tra `loop_ctr` có phải là số chẵn (`Mod 2 = 0`) không; nếu có, ghi giá trị vào cột A và tăng biến `cell` để chuyển sang ô tiếp theo.

Cách viết ngắn gọn hơn bằng `Step`:

Sub ForLoopToPrintEvenNumbers()

Dim loop_ctr As Integer

Dim cell As Integer

cell = 1

For loop_ctr = 2 To 10 Step 2

ActiveSheet.Range("A1").Offset(cell - 1, 0).Value = loop_ctr

cell = cell + 1

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Ở đây bắt đầu từ 2 và tăng `loop_ctr` mỗi lần 2, nên chỉ lặp qua các số chẵn.

Vòng lặp For lồng nhau (Nested For Loop)

Đôi khi cần một vòng For bên trong một vòng For khác.

Ví dụ 4: In số 1‑10 trên mọi sheet trong workbook.

Sub ForLoopPrintNumbers()

Dim loop_ctr As Integer

Dim sheet As Integer

For sheet = 1 To Worksheets.Count

For loop_ctr = 1 To 10

Worksheets(sheet).Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

Next loop_ctr

Next sheet

MsgBox "For Loop Completed!"

End Sub

Vòng ngoài duyệt các sheet, vòng trong duyệt các hàng A1:A10 của mỗi sheet.

Reverse For Loop (Vòng lặp For ngược)

Bạn cũng có thể để bộ đếm giảm.

Ví dụ 5: In số từ 10 xuống 1.

Sub ReverseForLoop()

Dim loop_ctr As Integer

Dim cell As Integer

cell = 1

For loop_ctr = 10 To 1 Step -1

ActiveSheet.Range("A1").Offset(cell - 1, 0).Value = loop_ctr

cell = cell + 1

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Vòng lặp vô hạn bằng For Loop

Nếu vô tình thay đổi giá trị bộ đếm bên trong vòng, vòng sẽ không bao giờ kết thúc.

'Không chạy đoạn mã này

Sub InfiniteForLoop()

Dim loop_ctr As Integer

Dim cell As Integer

For loop_ctr = 1 To 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr - 1 'đặt lại bộ đếm

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Mẹo: Không thay đổi giá trị của biến đếm bên trong vòng lặp.

Cách thoát (Break) khỏi For Loop

Dùng `Exit For` để dừng vòng lặp sớm.

Ví dụ 6: Tính tổng 20 số lẻ đầu tiên trong khoảng 1‑100.

Sub SumFirst20OddNumbers()

Dim loop_ctr As Integer

Dim odd_number_counter As Integer

Dim sum As Integer

For loop_ctr = 1 To 100

If (loop_ctr Mod 2 <> 0) Then

sum = sum + loop_ctr

odd_number_counter = odd_number_counter + 1

End If

If (odd_number_counter = 20) Then

Exit For

End If

Next loop_ctr

MsgBox "Sum of top 20 odd numbers is : " & sum

End Sub

Một vài ví dụ thực tiễn của VBA For Loop

Ví dụ 7: Tô màu các hàng chẵn.

Sub HighlightAlternateRows()

Dim loop_ctr As Integer

Dim Max As Integer

Dim clm As Integer

Max = ActiveSheet.UsedRange.Rows.Count

clm = ActiveSheet.UsedRange.Columns.Count

For loop_ctr = 1 To Max

If loop_ctr Mod 2 = 0 Then

ActiveSheet.Range(Cells(loop_ctr, 1), Cells(loop_ctr, clm)).Interior.ColorIndex = 28

End If

Next loop_ctr

MsgBox "For Loop Completed!"

End Sub

Ví dụ 8: Bảo vệ (protect) tất cả các sheet trong workbook.

Sub ProtectWorksheets()

Dim loop_ctr As Integer

For loop_ctr = 1 To ActiveWorkbook.Worksheets.Count

Worksheets(loop_ctr).Protect

Next loop_ctr

End Sub

Để bỏ bảo vệ, thay `Protect` bằng `Unprotect`.

Ví dụ 9: Duyệt mảng số và tìm giá trị lớn nhất, nhỏ nhất.

Sub ForLoopWithArrays()

Dim arr() As Variant

arr = Array(10, 12, 8, 19, 21, 5, 16)

Dim min_number As Integer

Dim max_number As Integer

min_number = arr(0)

max_number = arr(0)

Dim loop_ctr As Integer

For loop_ctr = LBound(arr) To UBound(arr)

If arr(loop_ctr) > max_number Then

max_number = arr(loop_ctr)

End If

If arr(loop_ctr) < min_number Then

min_number = arr(loop_ctr)

End If

Next loop_ctr

MsgBox "Largest Number: " & max_number & " Smallest Number: " & min_number

End Sub

VBA FOR EACH LOOP

For Each là một dạng vòng lặp nâng cao, dùng để duyệt một tập hợp (collection) các đối tượng. Bạn không cần quan tâm tới biến đếm; chỉ cần cung cấp collection và vòng lặp sẽ tự động duyệt từng phần tử.

Cú pháp của VBA For Each Loop

For Each item In collection_of_items

'Statements to be executed inside the loop

Next item

`collection_of_items` là một nhóm đối tượng; `item` là biến đại diện cho từng đối tượng trong collection tại mỗi vòng lặp.

Cách For Each Loop hoạt động

For Each cl In ActiveSheet.Range("A1:A10")

'Statements to be executed inside the loop

Next cl

Khi gặp `For Each`, VBA lấy phần tử đầu tiên của collection (ô A1) và gán cho `cl`, sau đó thực thi các câu lệnh bên trong. Khi đến `Next`, VBA lấy phần tử tiếp theo cho tới khi hết.

Một vài ví dụ đơn giản của For Each Loop

Ví dụ 1: Hiển thị tên tất cả các sheet đang hoạt động.

Sub ForEachDisplaySheetNames()

Dim sheetNames As String

For Each sht In ActiveWorkbook.Sheets

sheetNames = sheetNames & vbNewLine & sht.Name

Next sht

MsgBox "The Sheet names are : " & vbNewLine & sheetNames

End Sub

Ví dụ 2: Tính tổng các phần tử của một mảng.

Sub ForEachSumArrayElements()

Dim arr As Variant

Dim sum As Integer

arr = Array(1, 10, 15, 17, 19, 21, 23, 27)

For Each element In arr

sum = sum + element

Next element

MsgBox "The Sum is : " & sum

End Sub

Ví dụ 3: Hiển thị tên tất cả các workbook đang mở.

Sub ForEachDisplayWorkbookNames()

Dim workBookNames As String

For Each wrkbook In Workbooks

workBookNames = workBookNames & vbNewLine & wrkbook.Name

Next wrkbook

MsgBox "The Workbook names are : " & vbNewLine & workBookNames

End Sub

Nested VBA For Each Loop

Sub ForEachLoopNesting()

Dim result As String

For Each wrkbook In Workbooks

For Each sht In wrkbook.Sheets

result = result & vbNewLine & " Workbook : " & wrkbook.Name & " Worksheet : " & sht.Name

Next sht

Next wrkbook

MsgBox result

End Sub

Thoát (Exit) khỏi For Each Loop

Bạn có thể dùng `Exit For` để dừng vòng For Each.

Ví dụ 5: Hiển thị tên 3 sheet đầu tiên trong workbook hiện hành.

Sub ForEachDisplayFirstThreeSheetNames()

Dim sheetNames As String

Dim sheetCounter As Integer

For Each sht In ActiveWorkbook.Sheets

sheetNames = sheetNames & vbNewLine & sht.Name

sheetCounter = sheetCounter + 1

If sheetCounter >= 3 Then

Exit For

End If

Next sht

MsgBox "The Sheet names are : " & vbNewLine & sheetNames

End Sub

VBA DO WHILE LOOP

Do While là một loại vòng lặp sẽ thực thi các câu lệnh liên tục khi một điều kiện vẫn đúng. Khi điều kiện sai, vòng lặp dừng.

Cú pháp của Do While Loop

  • Cú pháp 1:

Do While condition

'Statements to be executed inside the loop

Loop

  • Cú pháp 2:

Do

'Statements to be executed inside the loop

Loop While condition

Trong cả hai, `condition` là điều kiện kiểm tra ở mỗi lần lặp.

Sự khác nhau giữa hai cú pháp

  • Cú pháp 1: điều kiện được kiểm tra trước khi vào vòng; nếu sai, vòng không thực hiện lần nào.
  • Cú pháp 2: điều kiện được kiểm tra sau khi thực hiện vòng ít nhất một lần.

Cách Do While Loop hoạt động

Syntax 1:

Dim loop_ctr As Integer

loop_ctr = 1

Do While loop_ctr < 10

'Statements

loop_ctr = loop_ctr + 1

Loop

Syntax 2:

Dim loop_ctr As Integer

loop_ctr = 1

Do

'Statements

loop_ctr = loop_ctr + 1

Loop While loop_ctr < 10

Một vài ví dụ đơn giản của Do While Loop

Ví dụ 1: In số từ 1 đến 10.

Sub DoWhileLoopPrintNumbers()

Dim loop_ctr As Integer

loop_ctr = 1

Do While loop_ctr <= 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr + 1

Loop

MsgBox "Loop Ends"

End Sub

Ví dụ 2: Tính tổng các số từ 1 đến 20.

Sub WhileLoopSumNumbers()

Dim loop_ctr As Integer

Dim result As Integer

loop_ctr = 1

result = 0

Do While loop_ctr <= 20

result = result + loop_ctr

loop_ctr = loop_ctr + 1

Loop

MsgBox "Sum of numbers from 1-20 is : " & result

End Sub

Ví dụ 3: Thể hiện rằng vòng luôn thực hiện ít nhất một lần khi điều kiện sai.

Sub DoWhileLoopTest()

Dim loop_ctr As Integer

loop_ctr = 100

Do

MsgBox "Loop Counter : " & loop_ctr

loop_ctr = loop_ctr + 1

Loop While loop_ctr <= 10

End Sub

Vòng lặp Do While lồng nhau (Nested Do While Loop)

Sub NestedDoWhileLoop()

Dim loop_ctr As Integer

Dim sheet As Integer

sheet = 1

Do While sheet <= Worksheets.Count

loop_ctr = 1

Do While loop_ctr <= 10

Worksheets(sheet).Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr + 1

Loop

sheet = sheet + 1

Loop

MsgBox "Nested While Loop Completed!"

End Sub

Vòng lặp vô hạn bằng Do While Loop

'Không chạy đoạn mã này

Sub InfiniteDoWhileLoop()

Dim loop_ctr As Integer

loop_ctr = 1

Do While loop_ctr <= 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

'thiếu câu lệnh tăng biến loop_ctr

Loop

MsgBox "Loop Ends"

End Sub

Mẹo: Khi có thể, nên dùng For Each hoặc For Next thay vì Do While/Do Until để tránh lỗi vòng vô hạn.

Thoát (Exit) khỏi Do While Loop

Dùng `Exit Do` để dừng vòng lặp.

Ví dụ 5: Tính tổng 15 số lẻ đầu tiên từ 1‑100.

Sub SumFirst15OddNumbers()

Dim loop_ctr As Integer

Dim odd_number_counter As Integer

Dim sum As Integer

loop_ctr = 1

Do While loop_ctr <= 100

If (loop_ctr Mod 2 <> 0) Then

sum = sum + loop_ctr

odd_number_counter = odd_number_counter + 1

End If

If (odd_number_counter = 15) Then

Exit Do

End If

loop_ctr = loop_ctr + 1

Loop

MsgBox "Sum of top 15 odd numbers is : " & sum

End Sub

VBA DO UNTIL LOOP

Do Until hoạt động tương tự Do While, chỉ khác cách kiểm tra điều kiện.

  • Do While: lặp khi điều kiện đúng.
  • Do Until: lặp cho đến khi điều kiện sai (tức là khi điều kiện trở thành đúng, vòng dừng).

Cú pháp

  • Cú pháp 1:

Do Until condition

'Statements

Loop

  • Cú pháp 2:

Do

'Statements

Loop Until condition

Cách Do Until Loop hoạt động

Syntax 1:

Dim loop_ctr As Integer

loop_ctr = 1

Do Until loop_ctr > 10

'Statements

loop_ctr = loop_ctr + 1

Loop

Syntax 2:

Dim loop_ctr As Integer

loop_ctr = 1

Do

'Statements

loop_ctr = loop_ctr + 1

Loop Until loop_ctr > 10

Một vài ví dụ đơn giản của Do Until Loop

Ví dụ 1: In số từ 1 đến 10.

Sub DoUntilLoopPrintNumbers()

Dim loop_ctr As Integer

loop_ctr = 1

Do Until loop_ctr > 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr + 1

Loop

MsgBox "Loop Ends"

End Sub

Ví dụ 2: Tính tổng các số từ 1 đến 20.

Sub DoUntilLoopSumNumbers()

Dim loop_ctr As Integer

Dim result As Integer

loop_ctr = 1

result = 0

Do Until loop_ctr > 20

result = result + loop_ctr

loop_ctr = loop_ctr + 1

Loop

MsgBox "Sum of numbers from 1-20 is : " & result

End Sub

Ví dụ 3: Thể hiện rằng vòng luôn thực hiện ít nhất một lần khi điều kiện đúng.

Sub DoUntilLoopTest()

Dim loop_ctr As Integer

loop_ctr = 100

Do

MsgBox "Loop Counter : " & loop_ctr

loop_ctr = loop_ctr + 1

Loop Until loop_ctr > 10

End Sub

Vòng lặp Do Until lồng nhau

Sub NestedDoUntilLoop()

Dim loop_ctr As Integer

Dim sheet As Integer

sheet = 1

Do Until sheet > Worksheets.Count

loop_ctr = 1

Do Until loop_ctr > 5

Worksheets(sheet).Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr + 1

Loop

sheet = sheet + 1

Loop

MsgBox "Nested Do Until Loop Completed!"

End Sub

Vòng lặp vô hạn bằng Do Until Loop

'Không chạy đoạn mã này

Sub InfiniteDoUntilLoop()

Dim loop_ctr As Integer

loop_ctr = 1

Do Until loop_ctr > 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

'thiếu câu lệnh tăng

Loop

MsgBox "Loop Ends"

End Sub

Thoát (Exit) khỏi Do Until Loop

Dùng `Exit Do` để dừng vòng lặp.

Ví dụ 5: Tính tổng 20 số chẵn đầu tiên từ 1‑100.

Sub SumFirst20EvenNumbers()

Dim loop_ctr As Integer

Dim even_number_counter As Integer

Dim sum As Integer

loop_ctr = 1

Do Until loop_ctr > 100

If (loop_ctr Mod 2 = 0) Then

sum = sum + loop_ctr

even_number_counter = even_number_counter + 1

End If

If (even_number_counter = 20) Then

Exit Do

End If

loop_ctr = loop_ctr + 1

Loop

MsgBox "Sum of top 20 even numbers is : " & sum

End Sub

WHILE … WEND LOOP (đã lỗi thời)

While … Wend được đưa vào VBA để tương thích ngược, nhưng Microsoft khuyến nghị dùng Do While thay thế.

Cú pháp

While condition

'Statements

Wend

Ví dụ: In số từ 1 đến 10.

Sub WhileWendExample()

Dim loop_ctr As Integer

loop_ctr = 1

While loop_ctr <= 10

ActiveSheet.Range("A1").Offset(loop_ctr - 1, 0).Value = loop_ctr

loop_ctr = loop_ctr + 1

Wend

MsgBox "Loop Ends!"

End Sub

Cách viết mã VBA trong Excel

Bạn có thể chèn mã VBA vào một bảng tính qua Visual Basic Editor. Để mở Visual Basic Editor:

  • Trên Windows: nhấn ALT + F11.
  • Trên Mac: nhấn Option + F11.

Sau khi mở, vào Insert → Module để tạo một mô-đun mới, dán mã vào và chạy bằng nút Run.

Mẹo gỡ lỗi

  • F5: chạy toàn bộ mã.
  • F9: đặt hoặc bỏ breakpoint.
  • F8: bước từng dòng (step‑into) để kiểm tra luồng thực thi.

---

Nếu bạn có bất kỳ câu hỏi nào liên quan tới vòng lặp VBA, hãy cho mình biết nhé.

Khám phá:  Hàm DAYS360 trong Excel – Cách Sử Dụng

Join LeQuocThai.Com on Telegram Channel

Lê Quốc Thái
Lê Quốc Tháihttps://lequocthai.com/
Yep! I am Le Quoc Thai codename name tnfsmith, one among of netizens beloved internet precious, favorite accumulate sharing all my knowledge and experience Excel, PC tips tricks, gadget news during over decades working in banking data analysis.

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây
Captcha verification failed!
CAPTCHA user score failed. Please contact us!

Join LeQuocThai.Com on Telegram Channel

Đọc nhiều nhất

BÀI VIẾT MỚI NHẤT

CÙNG CHỦ ĐỀ