Vòng lặp for each trong Excel VBA được dùng như thế nào? Hãy cùng mình tìm hiểu về công thức, cách dùng vòng lặp for each trong VBA có kèm theo các ví dụ cụ thể dưới đây nhé.
Gần như mọi vòng lặp (loop) trong VBA đều hoạt động tốt với các đối tượng. Vòng lặp for each là một trong số lựa chọn tốt nhất cho bạn làm việc với bộ sưu tập đối tượng. Nếu mới làm quen Excel VBA và đang tìm cách làm chủ vòng lặp for each, học hỏi từ những ví dụ là cách hay. Dưới đây là tất cả những điều bạn cần biết về vòng lặp for each trong Microsoft Excel.
Công thức của vòng lặp for each trong Excel VBA
Công thức vòng lặp for each khá giống với vòng lặp thông thường trong Excel VBA. Dưới đây là công thức chung:
For each variable_name in object_collection
[statement]
[statement]
[statement]
Next variable_name
Vòng lặp bắt đầu bằng từ khóa “for each”. Bạn có thể dùng bất kỳ tên biến, theo sau là bộ sưu tập đối tượng. Đối tượng trong vòng lặp for each có thể là ô, phạm vi, bảng tính, thậm chí workbook. Vòng lặp này trong Excel cho bạn sự linh hoạt khi làm việc với các bộ sưu tập Excel khác nhau.
Vòng lặp quay vòng qua từng bộ sưu tập và lưu trữ tham chiếu trong tên biến đã được xác định. Sau khi thực thi, VBA chạy các lệnh đã được lưu trữ trong vòng lặp và chuyển sang đối tượng tiếp theo ở bộ sưu tập. Giờ hãy cùng xem xét ví dụ để hiểu hơn về cấu trúc code.
Cách dùng vòng lặp for each trong Excel VBA
Giả sử bạn muốn in một số trong ô A1 tới A10. Cách tốt nhất là dùng vòng lặp for each với hàm phạm vi và để code thực hiện việc cần thiết. Dưới đây là cách bạn có thể làm nhiệm vụ đơn giản này:
1. Mở trình chỉnh sửa code VBA bằng cách nhấn Alt+ F11.
2. Chèn một mô đun bằng cách click Module trong tab Insert.
3. Tạo sub-routine bằng lệnh sub() trong cửa sổ mô đun chỉnh sửa code. Đảm bảo bạn gắn một tên ý nghĩa cho sub-routine này. Ví dụ ở đây bạn có thể dùng tên for_each_loop.
Giờ những vấn đề cơ bản đã được giải quyết, đã tới lúc viết code. Trong sub-routine, nhập lệnh sau:
Dim cell as range
For each cell in Sheets("Sheet1").Range("A1:A10")
cell.value = 10
Next cell
Khi chạy code, biến c sẽ lưu giá trị của A1. Tiếp theo, khi nó chuyển sang câu lệnh trong vòng lặp, nó sẽ đánh giá lệnh và nhập giá trị 10 trong ô đã được xác định, ví dụ, ô A1.
Cuối cùng, khi chuyển sang từ khóa Next, nó chuyển tới giá trị tiếp theo, ví dụ, ô A2. Vòng lặp chạy cho tới khi nó tới ô A10. Đây là kết quả cuối cùng:
Dùng vòng lặp với các đối tượng: ô, bảng tính và workbook
Excel có 3 kiểu đối tượng chính mà bạn có thể làm việc thường xuyên. Chúng là ô, sheet và workbook. Dưới đây là cách dùng vòng lặp for each với 3 kiểu đối tượng này.
Làm việc với cả ô và vòng lặp
Giả sử bạn muốn thêm một giá trị và một số điều kiện định dạng cho một phạm vi ô trong Sheet1. Ở bước đầu tiên, bạn cần xác định điều kiện trong vòng lặp, được theo sau bởi các lệnh định dạng.
Nhập code sau trong một sub-routine.
Sub for_each_loop()
Dim c As Range
For Each c In Sheets("Sheet1").Range("A1:A10")
With c
.Value = 10
.Font.Color = vbRed
.Font.Bold = True
.Font.Strikethrough = True
End With
Next c
End Sub
Hàm with hữu ích khi chạy nhiều hàm với một đối tượng cụ thể. Vì bạn muốn thực hiện một loạt nhiệm vị với biến c, bạn có thể kết hợp tất cả chúng bằng một hàm with…end with.
Vòng lặp cân bằng giá trị của c với giá trị từng ô và nhập giá trị là 10. Ngoài ra, nó thay đổi màu sắc của ô sang đỏ, in đậm và gạch chéo giá trị đó. Khi đã hoàn thành tất cả các bước, nó chuyển sang giá trị đã được xác định tiếp theo trong phạm vi này.
Dùng vòng lặp để kiểm soát bảng tính
Tương tự ví dụ trên, bạn có thể dùng vòng lặp for each để kiểm soát bảng tính. Ví dụ về cách thay đổi tên của Sheet1 thành Sheet3 bằng VBA.
Bạn có thể dùng code sau để đổi lại tên một worksheet hiện có trong Excel bằng VBA:
Sub for_each_loop_sheets() For Each sht In ThisWorkbook.Sheets If sht.Name = "Sheet1" Then sht.Name = "Sheet3" End If Next sht End Sub
Code này lặp qua từng sheet trong workbook và kiểm tra tên của từng sheet. Nếu nó thấy Sheet1, nó sẽ đổi tên đó thành Sheet3. Cứ tiếp tục như vậy qua các sheets còn lại. Khi tới sheet cuối cùng, nó thoát vòng lặp và sub-routine.
Chuyển workbook bằng vòng lặp
Cuối cùng, bạn có thể dùng vòng lặp for each trong Excel để chuyển qua các workbook khác nhau và chạy nhiệm vụ cụ thể. Xem xét ví dụ sau để thấy rõ điều đó:
Bạn có thể dùng lệnh VBA để thêm 3 workbook mới và đóng toàn bộ workbook đã mở. Viết code sau để thực hiện điều đó:
Sub loop_wrkbook()
Dim wrkbook as workbook
Workbooks.Add
Workbooks.Add
Workbooks.Add
For Each wrkbook In Workbooks
wrkbook.Close
Next wrkbook
End Sub
Dùng lệnh If lồng nhau với loop
Giống như ví dụ trên, bạn có thể sử dụng lệnh IF trong vòng lặp để kiểm tra các điều kiện cụ thể. Giờ hãy thử thay đổi màu nền của ô dựa trên các giá trị nằm trong ô đó.
Ô A1:A20 có một vài số ngẫu nhiên. Bạn có thể viết một vòng lặp để duyệt qua từng ô đã cho trong phạm vi. Nếu giá trị của ô đó nhỏ hơn 10, màu ô đó sẽ đổi sang màu đỏ. Nếu giá trị ô đó lớn hơn 10, nó sẽ chuyển thành màu xanh lá. Dùng code sau cho mục đích này:
Sub loop_w_if()
Dim c As Range
For Each c In Sheets("Sheet4").Range("A1:A20")
If c.Value < 10 Then
c.Interior.ColorIndex = 3
Else: c.Interior.ColorIndex = 4
End If
Next c
End Sub
Kết quả bạn nhận được trông sẽ như sau:
Excel VBA không giới hạn chỉ ở vòng lặp for each. Bạn còn có nhiều lựa chọn hữu ích khác để triển khai các hàm khác dễ dàng. Hi vọng bài viết giúp bạn hiểu rõ hơn về cách dùng vòng lặp for each VBA Excel.