Originally posted on 12/02/2022 @ 21:34
HƯỚNG DẪN ĐẦY ĐỦ VBA FOR LOOP
Bài viết dưới đây Học Gia Sư Kế Toán sẽ hướng dẫn đầy đủ vòng lặp For trong VBA – VBA for Loop cho các bạn dễ dàng ứng dụng vào trong công việc nhé.
Bảng hướng dẫn về VBA For Loop
Loop format | Description | Example |
For … Next | Lặp 10 lần |
For i = 1 To 10 Next |
For … Next | Lặp 5 lần. i=2,4, 6 etc. |
For i = 2 To 10 Step 2 Next |
For … Next | Lặp theo thứ tự ngược lại |
For i = 10 To 1 Step -1 Debug.Print i Next |
For … Next | Lặp qua bộ sưu tập |
For i = 1 To coll.Count Debug.Print coll(i) Next |
For … Next | Lặp qua mảng |
For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next i |
For … Next | Lặp qua mảng 2D |
For i = LBound(arr) To UBound(arr) For j = LBound(arr,2) To UBound(arr,2) Debug.Print arr(i, j) Next j Next i |
For Each … Next | Lặp qua bộ sưu tập |
Dim item As Variant For Each item In coll Debug.Print item Next item |
For Each … Next | Lặp qua mảng |
Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Lặp qua mảng 2D |
Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Lặp qua dictionary |
Dim key As Variant For Each key In dict.Keys Debug.Print key, dict(key) Next key |
Both types | Kết thúc vòng lặp |
For i = 1 To 10 If Cells(i,1) = “found” Then Exit For End If Next i |
VBA For Loops là gì?
Vòng lặp đơn giản là cách chạy các dòng mã, các dòng mã thường chứa một biến thay đổi nhỏ mỗi khi vòng lặp chạy. Ví dụ: một vòng lawoj có thể vào ô A1, sau đó đến ô A2, A3.. Sự thay đổi nhỏ ở đây là hàng.
Ví dụ 1 VBA For Loop
Đoạn mã sau đây sẽ in các giá trị từ 1 đến 5 trong Immediate Window (Ctrl+G).

Immediate window
Để xem immediate window, chọn View –> Immediate window từ menu (Ctrl+G). Hàm Debug.Print sẽ ghi vào giá trị Immediate window.


Ví dụ 2
Bây giờ, giả sử chúng ta muốn in ra các số từ 1 đến 20. Chúng ta sẽ cần thêm 15 dòng nữa vào ví dụ trên. Tuy nhiên chỉ cần viết Debug.Print một lần:

Kết quả là:

Nếu chúng ta cần in các số từ 1 đến 1000 thì chúng ta chỉ cần thay đổi 20 thành 1000.
Thông thường khi chúng ta viết mã, chúng ta sẽ sử dụng một biến thay vì một số như 20 hoặc 1000. Điều này linh hoạt hơn và cho phép chúng ta quyết định số lần bạn muốn chạy vòng lặp khi mã đang chạy. Ví dụ sau giải thích điều này.
Ví dụ 3
Một tác vụ phổ biến trong Excel là đọc tất cả các hàng có dữ liệu.
Cách bạn tiếp cận nhiệm vụ này như sau
- Tìm hàng cuối cùng của dữ liệu
- Lưu trữ giá trị trong biến
- Sử dụng biến để xác định số lần vòng lặp chạy
Sử dụng một biến trong vòng lặp làm cho mã rất linh hoạt, nó hoạt động cho dù có bao nhiêu hàng.
Hãy xem một ví dụ. Giả sử bạn nhận được một tờ danh sách các loại trái cây (Fruit) và doanh thu (Sales) hàng ngày của chúng. Bạn muốn đếm số lượng Cam (Orange) đã bán và danh sách này sẽ có kích thước khác nhau tùy thuộc vào doanh số.

Chúng ta có thể sử dụng mã để đếm số oranges:

Chúng ta có thể áp dụng mã này để thay đổi số lượng mặt hàng Fruit. Nếu tăng số lượng mặt hàng lên một giá trị như 10.000 thì sẽ thấy sự khác biệt về thời gian. Vòng lặp siêu nhanh và hoạt động khá mạnh mẽ.
Ưu điểm của VBA For Loop
Ưu điểm của VBA For Loop:
- Tiết kiệm dòng mã.
- Linh hoạt.
- Xử lý nhanh.
Vòng lặp VBA For là vòng lặp phổ biến nhất mà bạn sẽ sử dụng trong Excel VBA. Vòng lặp For được sử dụng khi có thể xác định số lần nó sẽ được chạy. Ví dụ, nếu bạn muốn lặp lại điều gì đó hai mươi lần.
Định dạng VBA For Loop
VBA For Loop có định dạng như sau:
For <variable> = <start value> to <end value>
Next <variable>
Giá trị bắt đầu và kết thúc có thể là biến. Ngoài ra, biến sau Next là tùy chọn nhưng giúp chúng ta biết rõ nó thuộc về vòng lặp for nào.
Cách hoạt động của vòng lặp For – VBA for loop
Ví dụ vòng lặp for đơn giản in các số từ 1 đến 3:

Cách hoạt động của mã này như sau:
i được đặt thành 1
Giá trị của i (bây giờ là 1) được xuất
i được đặt thành 2
Giá trị của i (bây giờ là 2) được xuất
i được đặt thành 3
Giá trị của i (bây giờ là 3) được xuất
Nếu chúng tôi không sử dụng vòng lặp thì mã tương đương sẽ là:

Dòng i = i + 1 được sử dụng để thêm 1 vào i và là một cách phổ biến trong lập trình để cập nhật bộ đếm.
Sử dụng Step với VBA For Loop
Có thể thấy i lần lượt tăng lên và bạn có thể chỉ định số lần bằng cách sử dụng Step.
Ví dụ:

Bạn có thể sử dụng một số âm thì Step sẽ tính ngược lại:

Lưu ý: nếu Step là số dương thì số bắt đầu phải thấp hơn số kết thúc. Vòng lặp sau sẽ không chạy vì số bắt đầu 20 lớn hơn 10.

Nếu Step là số âm thì số bắt đầu phải lớn hơn số kết thúc.
Thoát khỏi vòng lặp For
Đôi khi chúng ta muốn kết thúc vòng lặp sớm hơn chẳng hạn khi đọc dữ liệu xấu.
Chúng ta có thể sử dụng Exit For để kết thúc vòng lặp như đoạn mã dưới đây:

Sử dụng VBA For Loop với Collection (Bộ sưu tập)
Vòng lặp For cũng có thể được sử dụng để đọc các mục trong Bộ sưu tập. Trong ví dụ sau, chúng ta hiển thị tên của tất cả các workbook đang mở.

Sử dụng các vòng lặp lồng nhau
Đôi khi có thể chúng ta muốn sử dụng các vòng lặp lồng vào nhau ví dụ chúng ta muốn in tên của các worksheet của mỗi workbook đang mở.
Vòng lặp đầu tiên sẽ đi qua mỗi workbook đang mở, trong mỗi vòng lặp này chạy thì nó sẽ sử dụng vòng lặp thứ hai đi qua tất cả worksheet của workbook đó.
Ví dụ đoạn mã sau đây:

Mã hoạt động như sau:
Vòng lặp đầu tiên đặt i thành 1
Sau đó, vòng lặp thứ hai sử dụng workbook tại 1 để đi qua các worksheet.
Vòng lặp đầu tiên đặt i thành 2
Sau đó, vòng lặp thứ hai sử dụng workbook tại 2 để đi qua các worksheet.
và như thế
The VBA For Each Loop (VBA cho từng vòng lặp)
Vòng lặp VBA For Each được sử dụng để đọc các mục từ một tập hợp hoặc một mảng. Chúng ta có thể sử dụng vòng lặp For Each để truy cập tất cả các workbook đang mở . Điều này là do Application.Workbooks là một tập hợp các workbook đang mở. Ví dụ về For Each Loop:

Định dạng VBA cho mỗi vòng lặp
For Each <variable> in <collection>
Next <variable>
Để tạo một vòng lặp For Each, chúng ta cần một biến cùng loại chứa trong bộ sưu tập (Collection). Trong ví dụ ở đây, chúng ta đã tạo một biến kiểu Workbook. Nếu bộ sưu tập có các mục khác loại, chúng ta có thể khai báo biến dưới dạng một variant.
VBA chứa một bộ sưu tập được gọi là worksheet. Nó là tập hợp các worksheet thuộc loại worksheet (bình thường) và Biểu đồ (khi bạn di chuyển biểu đồ thành một worksheet đầy đủ). Để xem qua bộ sưu tập này, bạn sẽ khai báo biến dưới dạng Variant.
Đoạn mã sau sử dụng For Each để in ra tên của tất cả các worksheet trong workbook hiện tại.

Thứ tự các mục trong vòng lặp For
Đối với vòng lặp For Each sẽ đi qua các mục theo một cách duy nhất.
Ví dụ: nếu bạn xem qua tất cả các worksheet trong workbook, nó sẽ đi từ trái sang phải. Nếu đi qua một vùng dữ liệu, nó sẽ bắt đầu ở ô thấp nhất, ví dụ:dữ liệu (“A1: A10”) sẽ trả về A1, A2, A3, v.v.
Điều này có nghĩa là nếu bạn muốn bất kỳ thứ tự nào khác thì bạn cần sử dụng vòng lặp For .
Cả hai vòng lặp trong ví dụ sau sẽ đọc các worksheet từ trái sang phải:

Vòng lặp For Each được viết gọn gàng hơn. Tuy nhiên, nếu muốn đọc các worksheet theo bất kỳ thứ tự nào khác, ví dụ từ phải sang trái thì phải sử dụng vòng lặp for:

Sử dụng VBA For each Loop với mảng
Khi sử dụng vòng lặp For Each với các mảng ở chế độ chỉ đọc.
Ví dụ:

Trong vòng lặp đầu tiên, chúng ta cố gắng gán s cho “Z”. Khi chạy s hiện đang tham chiếu đến chuỗi “Z” và không tham chiếu đến mục trong mảng.
Trong vòng lặp thứ hai, chúng ta in ra mảng và không có giá trị nào thay đổi.
Khi chúng ta sử dụng For Loop, chúng ta có thể thay đổi mảng. Nếu chúng ta thay đổi mã trước đó để sử dụng Vòng lặp For nó sẽ thay đổi tất cả các giá trị của mảng thành “Z”.

Nếu Bộ sưu tập của bạn đang lưu trữ Đối tượng, bạn có thể thay đổi các mục bằng vòng lặp For Each.
Sử dụng For each loop lồng nhau
Ví dụ các vòng lặp lồng vào nhau

Sử dụng vòng lặp For Each để thực hiện tác vụ tương tự:

Cách này gọn gàng hơn để thực hiện tác vụ trên so với việc sử dụng For Loop:
Mã chạy như sau:
- Nhận Workbook đầu tiên từ bộ sưu tập Workbooks
- Xem qua tất cả các worksheet trong workbook.
- In chi tiết workbook/ worksheet.
- Nhận các workbook tiếp theo trong bộ sưu tập
- Lặp lại các bước từ 2 đến 3
- Tiếp tục cho đến khi không còn workbook nào nữa trong bộ sưu tập.
Cách lặp qua một phạm vi
Trong Excel VBA, Vòng lặp For sử dụng phổ biến nhất là đọc một vùng dữ liệu.
Giả sử chúng ta có tập dữ liệu trong ảnh chụp màn hình bên dưới. Nhiệm vụ của chúng ta là viết mã sẽ đọc qua dữ liệu và sao chép số tiền vào cột J. Chúng ta sẽ chỉ sao chép số tiền lớn hơn 200.000.


Ví dụ về đoạn mã:
Đây là một ví dụ rất cơ bản về sao chép dữ liệu bằng Excel VBA. Học Gia Sư Kế Toán hy vọng bạn đã nắm rõ toàn bộ kiến thức về vòng lặp For – VBA for Loop rồi. Xin chào và hẹn gặp lại tại những bài viết thú vị trong thời gian tới nhé!
© Học Gia Sư Kế Toán. All rights reserved.