28.9 C
Ho Chi Minh City
Thursday, June 25, 2026
geo.gg
Trang chủCông thức ExcelVBA Loops – For, For Each, Do While và Do Until Loops

VBA Loops – For, For Each, Do While và Do Until Loops

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, tôi sẽ giải thích tất cả các VBA Loops kèm ví dụ. Nhưng trước khi đi sâu vào chủ đề, hãy cùng hiểu vòng lặp là gì và tại sao nó lại cần thiết.

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

Vòng lặp là một lệnh có thể lặp lại liên tục một tập hợp các câu lệnh cho đến khi một điều kiện nhất định được đáp ứng.

Vòng lặp có thể phục vụ các mục đích sau:

  • Giúp lặp lại một tập hợp các câu lệnh.
  • Giúp kiểm tra một điều kiện nào đó nhiều lần.
  • Cũng có thể dùng để xây dựng logic sleepwait tùy chỉnh trong code.

VBA FOR LOOP

For loop là một trong những vòng lặp quan trọng và được sử dụng thường xuyên nhất trong VBA. For Loop đôi khi còn được gọi là “For Next Loop”.

For Loops cho phép bạn lặp lại một tập hợp các câu lệnh một số lần xác định trước.

Cú pháp của VBA For Loop

Cú pháp cơ bản của một vòng lặp For trong VBA như sau:

For loop_ctr = start_num To end_num [step_increment]

'Các câu lệnh sẽ được thực thi trong vòng lặp

Next loop_ctr

Trong đó, loop_ctr là biến đếm vòng lặp, là trụ cột của “For Next Loop”, vì vậy nó còn được gọi là “người giữ thời gian” của vòng lặp. Biến này sẽ được 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 của vòng lặp.
  • end_num: số kết thúc của vòng lặp.
  • step_increment: tham số tùy chọn, xác định mức tăng của loop_ctr sau mỗi lần lặp. Mặc định là 1.

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

Ví dụ đơn giản:

For loop_ctr = 1 To 100

'Các câu lệnh sẽ được thực thi trong vòng lặp

Next loop_ctr

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

Nếu bạn chưa rõ, hãy xem sơ đồ luồng dưới đây:

Giải thích sơ đồ luồng

  • Thực thi câu lệnh FOR, khởi tạo loop_ctrstep_increment.
  • Đánh giá điều kiện. Nếu TRUE, thực hiện khối lệnh `Code Block`; nếu FALSE, thoát ra ngoài vòng lặp.
  • Khi khối lệnh thực hiện xong, loop_ctr được tăng lên và quá trình lặp lại từ bước 2.

Một vài ví dụ đơn giản của 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:

  • Khai báo biến đếm loop_ctr.
  • Khởi tạo loop_ctr = 1, end_num = 10.
  • Trong vòng lặp, ghi giá trị loop_ctr vào cột A.
  • Vì không chỉ định step_increment, mặc định tăng 1.

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:

  • Biến result lưu tổng.
  • Mỗi vòng lặp cộng loop_ctr vào result.
  • Sau 10 vòng, hiển thị tổng.

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 Mod 2 = 0` để xác định số chẵn.
  • Khi thỏa, ghi vào ô và tăng biến cell.

Logic thay thế:

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
  • Sử dụng `Step 2` để tăng loop_ctr ngay từ đầu.

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

Khi cần lặp một vòng lặp trong một vòng lặp khác, gọi là nesting.

Ví dụ 4: In các số 1‑10 trên mọi sheet trong một 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 outer lặp qua các sheet, inner lặp qua các số.

For Loop ngược (Reverse For Loop)

Bạn cũng có thể đếm ngược:

Ví dụ 5: Đếm ngược 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 (Infinite Loop) bằng For Loop

Nếu vô tình đặt lại loop_ctr trong vòng lặp, sẽ gây vòng lặp vô hạn:

'Do not run this code
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   'Reset -> vô hạn
Next loop_ctr
MsgBox "For Loop Completed!"
End Sub

Mẹo: Không thay đổi giá trị biến đếm trong thân vòng lặp.

Thoát khỏi vòng For Loop

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

Ví dụ 6: Tính tổng 20 số lẻ đầu tiên từ 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
  • Khi đã đếm đủ 20 số lẻ, dùng `Exit For` dừng vòng lặp.

Một vài ví dụ thực tế của For Loop

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

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
  • Thay `Protect` bằng `UnProtect` để bỏ bảo vệ.

Ví dụ 9: Duyệt mộ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 collection (tập hợp) các đối tượng.

Cú pháp

For Each item In collection_of_items
'Các câu lệnh sẽ được thực thi trong vòng lặp
Next item
  • `collection_of_items` là tập hợp các đối tượng.
  • `item` đại diện cho từng đối tượng trong tập hợp tại mỗi lần lặp.

Cách hoạt động

For Each cl In ActiveSheet.Range("A1:A10")
'Các câu lệnh sẽ được thực thi trong vòng lặp
Next cl
  • Khi gặp `For Each`, VBA khởi tạo `cl` với đối tượng đầu tiên trong tập hợp (ô A1).
  • Sau khi thực hiện khối lệnh, `cl` được gán cho đối tượng tiếp theo cho tới khi hết.

Ví dụ đơn giản

Ví dụ 1 – Hiển thị tên tất cả các Worksheet đ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 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

Vòng lặp For Each lồng nhau

Ví dụ 4 – Hiển thị tên các Workbook và các Worksheet của chúng

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 khỏi vòng For Each

Cũng dùng `Exit For`.

Ví dụ 5 – Chỉ hiển thị 3 sheet đầu tiên

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 thực thi các câu lệnh trong khi một điều kiện vẫn TRUE. Khi điều kiện trở thành FALSE, vòng lặp dừng.

Cú pháp

Cú pháp 1

Do While condition
'Các câu lệnh sẽ được thực thi trong vòng lặp
Loop

Cú pháp 2

Do
'Các câu lệnh sẽ được thực thi trong vòng lặp
Loop While condition
  • cú pháp 1, điều kiện được kiểm tra ngay khi vào vòng lặp; nếu FALSE, vòng lặp không thực hiện lần nào.
  • cú pháp 2, điều kiện được kiểm tra ở cuối, do đó vòng lặp luôn thực hiện ít nhất một lần.

Cách hoạt động

Cú pháp 1

Dim loop_ctr As Integer
loop_ctr = 1
Do While loop_ctr < 10
'Câu lệnh trong vòng lặp
loop_ctr = loop_ctr + 1
Loop

Cú pháp 2

Dim loop_ctr As Integer
loop_ctr = 1
Do
'Câu lệnh trong vòng lặp
loop_ctr = loop_ctr + 1
Loop While loop_ctr < 10

Lưu ý: Cú pháp 2 luôn thực hiện ít nhất một lần.

Ví dụ đơn giản

Ví dụ 1 – In các số 1‑10 vào Excel

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ố 1‑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 hành vi “ít nhất một lần” của cú pháp 2

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
  • Dù điều kiện sai, vòng lặp vẫn chạy một lần vì kiểm tra ở cuối.

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

Ví dụ 4 – In các số 1‑10 trên mọi sheet

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 Do While

'Do not run this code
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
'Quên tăng biến loop_ctr -> vô hạn
Loop
MsgBox ("Loop Ends")
End Sub

Mẹo: Khi có thể, ưu tiên dùng For Each hoặc For Next thay vì Do While.

Thoát khỏi vòng Do While

Dùng `Exit Do`.

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 tương tự Do While, nhưng điều kiện ngược lại: vòng lặp tiếp tục cho đến khi điều kiện TRUE.

Cú pháp

Cú pháp 1

Do Until condition
'Các câu lệnh sẽ được thực thi trong vòng lặp
Loop

Cú pháp 2

Do
'Các câu lệnh sẽ được thực thi trong vòng lặp
Loop Until condition
  • cú pháp 1, nếu điều kiện TRUE ngay từ đầu, vòng lặp không thực hiện.
  • cú pháp 2, vòng lặp luôn thực hiện ít nhất một lần.

Cách hoạt động

Cú pháp 1

Dim loop_ctr As Integer
loop_ctr = 1
Do Until loop_ctr > 10
'Câu lệnh trong vòng lặp
loop_ctr = loop_ctr + 1
Loop

Cú pháp 2

Dim loop_ctr As Integer
loop_ctr = 1
Do
'Câu lệnh trong vòng lặp
loop_ctr = loop_ctr + 1
Loop Until loop_ctr > 10

Lưu ý: Cú pháp 2 luôn thực hiện ít nhất một lần.

Ví dụ đơn giản

Ví dụ 1 – In các số 1‑10 vào Excel

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ố 1‑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 hành vi “ít nhất một lần” của cú pháp 2

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
  • Mặc dù điều kiện đã TRUE ngay từ đầu, vòng lặp vẫn chạy một lần vì kiểm tra ở cuối.

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

Ví dụ 4 – In số 1‑5 trên mọi sheet

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 Do Until

'Do not run this code
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
'Quên tăng biến loop_ctr -> vô hạn
Loop
MsgBox ("Loop Ends")
End Sub

Mẹo: Khi có thể, ưu tiên dùng For Each hoặc For Next.

Thoát khỏi vòng Do Until

Cũng dùng `Exit Do`.

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
'Các câu lệnh sẽ được thực thi trong vòng lặp
Wend

Ví dụ: In các số 1‑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
  • Khi `Wend` gặp, chương trình quay lại kiểm tra điều kiện `While`.

Cách viết mã VBA trong Excel

Bạn có thể thêm mã VBA vào một bảng tính bằng Visual Basic Editor (VBE).

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

Sau khi mở VBE, vào Insert → Module để chèn một module mới.

Bây giờ bạn có thể sao chép‑dán các đoạn mã trên vào module và chạy chúng bằng nút Run.

Mẹo gỡ lỗi

  • F5: chạy toàn bộ code.
  • F9: đặt hoặc bỏ breakpoint.
  • F8: step‑into, chạy từng dòng để kiểm tra.

Nếu bạn có bất kỳ câu hỏi nào liên quan đến VBA Loops, đừng ngại để lại bình luận nhé!

Khám phá:  Hàm CLEAN 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Ủ ĐỀ