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é.
Xem nhanh
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 |
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.
Đ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.
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.
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
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:
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.
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.
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.
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.
Đô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:
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ở.
Đô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ế
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:
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.
Đố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:
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.
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:
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 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é!