HƯỚNG DẪN ĐẦY ĐỦ VBA FOR LOOP

Bài viết dưới đây Học Excel Online 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).

1- VBA for Loop
1- VBA for Loop

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.

2- VBA for Loop
2- VBA for Loop
3- VBA for Loop
3- VBA for Loop

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:

4- VBA for Loop
4- VBA for Loop

Kết quả là:

5- VBA for Loop
5- VBA for Loop

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

  1. Tìm hàng cuối cùng của dữ liệu
  2. Lưu trữ giá trị trong biến
  3. 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ố.

6- VBA for Loop
6- VBA for Loop

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

7- VBA for Loop
7- VBA for Loop

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:

8- VBA for Loop
8- VBA for Loop

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

9- VBA for Loop
9- VBA for Loop

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

10- VBA for Loop
10- VBA for Loop

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

11- VBA for Loop
11- VBA for Loop

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. 

12- VBA for Loop
12- VBA for Loop

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:

13- VBA for Loop
13- VBA for Loop

 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ở.

14- VBA for Loop
14- VBA for Loop

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:

15- VBA for Loop
15- VBA for Loop

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:

16- VBA for Loop
16- VBA for 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.

17- VBA for Loop
17- VBA for Loop

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:

18- VBA for Loop
18- VBA for Loop

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:

19- VBA for Loop
19- VBA for Loop

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

20- VBA for Loop
20- VBA for Loop

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”.

21- VBA for Loop
21- VBA for Loop

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

22- VBA for Loop
22- VBA for Loop

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

23- VBA for Loop
23- VBA for Loop

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:

  1. Nhận Workbook đầu tiên từ bộ sưu tập Workbooks
  2. Xem qua tất cả các worksheet trong workbook.
  3. In chi tiết workbook/ worksheet.
  4. Nhận các workbook tiếp theo trong bộ sưu tập
  5. Lặp lại các bước từ 2 đến 3
  6. 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.

24- VBA for Loop
24- VBA for Loop
25- VBA for Loop
25- VBA for Loop

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 Excel Online 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é!


Tác giả: dtnguyen (Nguyễn Đức Thanh)

· · ·

Khóa học mới xuất bản