Cách sử dụng vòng lặp For Each trong VBA thông qua ví dụ thực tế

For Each được dùng để xử lý các hành động lặp đi lặp lại một cách hữu hạn mà không yêu cầu người dùng đặt số lần lặp.
Cách sử dụng vòng lặp For Each trong VBA thông qua ví dụ thực tế

Hinh anh vong lap for each trong vba excel

Vòng lặp For...Each là gì ?

Mặc dù các vòng lặp For Next hoàn toàn có khả năng lặp qua một mảng ô hai chiều, nhưng có một loại vòng lặp khác phù hợp lý tưởng hơn với loại nhiệm vụ này. Đó là vòng lặp For Each.

Vòng lặp For Each lặp qua một tập hợp các đối tượng trong Excel - như tập hợp tất cả các trang tính trong sổ làm việc hoặc tập hợp tất cả các ô trong một miền ô.

Các vòng lặp For Each là tối ưu để lặp qua các phần tử của một tập hợp mà không cần phải lo lắng về việc tính toán số lần lặp cần thiết.

Đối với các tình huống cụ thể này - lặp qua tập hợp các đối tượng Excel – vòng lặp For Each thường khá đơn giản là một giải pháp thay thế nhanh hơn, dễ dàng hơn và trực quan hơn so với vòng lặp For Next.

Mỗi vòng lặp For Each được sử dụng để thực hiện một câu lệnh hoặc một nhóm câu lệnh cho từng phần tử trong mảng. Vòng lặp " For Each " là một biến dạng hữu dụng của vòng lặp " For...Next ", nó hoạt động trên một tập các đối tượng. Vòng lặp này được thực hiện cho từng phần tử trong một mảng hoặc tập hợp. Do đó, biến đếm vòng lặp sẽ không tồn tại trong vòng lặp For Each này. Nó thường được sử dụng với các mảng hoặc trong tập hợp của các đối tượng hệ thống tệp để hoạt động theo cách đệ quy.

Có một số loại vòng lặp trong VBA, Trong bài viết này, chúng tôi trình bày cách sử dụng vòng lặp For Each trong Excel VBA. Người dùng sử dụng vòng lặp For Each để xử lý các hành động lặp đi lặp lại một cách hữu hạn. Tuy nhiên, vòng lặp For Each không yêu cầu người dùng đặt số lần lặp lại bằng cách sử dụng biến đếm. Ngoài ra, các bạn có thể tham khảo bài viết về vòng lặp For...Next trong VBA Excel tại đây.

Cú pháp:

For Each element in collection

[statements1]

[statements 2]

[statements 3]

....

[ Statement n]

Next [element]

Trong đó:

element: Một biến được sử dụng để giữ tên của mỗi phần tử trong tập.

collection: Tên của tập.

Statement (câu lệnh): Các câu lệnh để thực thi cho mỗi phần tử trong tập.

Sơ đồ khối:

Hinh anh vong lap for each trong vba excel 1

Một số lưu ý khi sử dụng vòng lặp For...Each:

● Khối For…Each được sử dụng nếu có ít nhất một phần tử trong nhóm. Sau khi vòng lặp được tiến hành, tất cả các câu lệnh trong vòng lặp được thực hiện cho phần tử đầu tiên trong nhóm. Nếu có nhiều phần tử hơn trong nhóm, các câu lệnh trong vòng lặp tiếp tục thực hiện cho từng phần tử. Khi không còn phần tử nào trong nhóm, vòng lặp sẽ thoát và quá trình thực thi tiếp tục với câu lệnh theo sau câu lệnh Next.

● Bất kỳ số lượng câu lệnh Exit For nào cũng có thể được đặt ở bất kỳ đâu trong vòng lặp như một cách thay thế để thoát. Exit For thường được sử dụng sau khi đánh giá một số điều kiện, ví dụ If…Then và chuyển quyền kiểm soát sang câu lệnh ngay sau Next.

● Bạn có thể lồng các vòng lặp For...Each...Next bằng cách đặt một vòng lặp For...Each...Next trong một vòng lặp khác. Tuy nhiên, mỗi phần tử vòng lặp phải là duy nhất.

Ví dụ 1:

Trong bảng danh sách tiền thưởng, hãy xác định mức thưởng cho từng thành viên biết: Nếu chức vụ giám đốc có mức thưởng là $1000; phó giám đốc có mức thưởng là $800; trưởng phòng có mức thưởng là $500; phó trưởng phòng có mức thưởng là $300; còn lại nhân viên có mức thưởng là $150.

Hinh anh vong lap for each trong vba excel 2

Các đối tượng:

Miền C3:C12 chứa thông tin chức vụ của từng thành viên (ta có thể đặt tên là: bien_CV để lưu miền giá trị các ô).

Mỗi ô trong phạm vi miền từ C3:C12 là đối tượng cần xét (ta có thể đặt tên là:bien_DT để duyệt phạm vi miền).

Giá trị đối tượng cần so sánh: ô H3 có nội dung là “GD”; ô H4 có nội dung là “PGD”; ô H5 có nội dung là “TP”; ô H6 có nội dung là “PP”; ô H7 có nội dung là “NV”.

Kết quả ta xét từng trường hợp nếu mệnh đề thỏa mãn là ô H3 có giá trị là $1000; là ô H4 có giá trị là $800; là ô H5 có giá trị là $500; là ô H6 có giá trị là $300; là ô H7 có giá trị là $150.

Kết quả sẽ được điền tương ứng vào miền D3:D12, tương ứng theo dòng đối tượng được xét.

Mở Tab Developer > chọn Trình soạn thảo Visual Basic từ nhóm Code hoặc bạn cũng có thể nhấn tổ hợp phím Alt + F11 để mở VBA (trình soạn thảo trực quan cơ bản nơi chúng ta có thể viết mã) hoặc Nhấp chuột phải vào tên sổ làm việc, rồi chọn > View code, sau đó > nhấn vào Insert > chọn Module để chèn một mô-đun. Sau khi một mô-đun được chèn vào, chúng ta có thể viết mã của mình như sau:


Sub Thuong_NV()
Dim Bien_CV as Range
Dim Bien_DT as Range
Set Bien_CV=Sheet1.Range(“C3:C12”)
For Each Bien_DT in Bien_CV
Bien_DT.Offset(0,1).NumberFormat = "[$$-409]#,##0"
Select case Bien_DT.Value
Case Sheet1.Range(“H3”).Value
Bien_DT.Offset(0,1).Value= Sheet1.Range(“I3”).Value
Case Sheet1.Range(“H4”).Value
Bien_DT.Offset(0,1).Value= Sheet1.Range(“I4”).Value
Case Sheet1.Range(“H5”).Value
Bien_DT.Offset(0,1).Value= Sheet1.Range(“I5”).Value
Case Sheet1.Range(“H6”).Value
Bien_DT.Offset(0,1).Value= Sheet1.Range(“I6”).Value
Case else
Bien_DT.Offset(0,1).Value= Sheet1.Range(“I7”).Value
End Select
Next Bien_DT	
End Sub

Giải thích những gì đã xảy ra trong đoạn mã trên:

Bắt đầu câu lệnh với cú pháp khai báo 2 biến bằng từ khóa Dim là bien_CV và bien_DT.

Sử dụng từ khóa set để Thiết lập phạm vi cho biến chức vụ là miền C3:C12.

Thực hiện vòng lặp For Each với từng đối tượng trong chức vụ.

Dùng cấu trúc Select...Case để so sánh giá trị của biến Đối tượng với lần lượt các giá trị tại ô H3, H4, H5, H6, H7.

Dùng phương thức OFFSET để dịch chuyển sang 1 cột về bên phải so với biến đối tượng. Đây là vị trí lấy kết quả thỏa mãn điều kiện.

Kết quả Đầu ra khi thực thi:

Hinh anh vong lap for each trong vba excel 3

Ví dụ 2: Sử dụng Excel VBA cho mỗi câu lệnh vòng lặp với đối tượng phạm vi

Giả sử chúng ta có một sổ làm việc với một trang tính, các ô E3: E12 chứa các số. Chúng ta muốn áp dụng cho tô màu và độ đậm bằng cách gán các ô làm Đối tượng Phạm vi, bằng cách sử dụng vòng lặp For Each. Ngoài ra, chúng ta muốn làm tròn tất cả các số thành số nguyên gần nhất bằng cách sử dụng hàm Round trong VBA. Bảng dữ liệu được hiển thị hình ảnh bên dưới:

Hinh anh vong lap for each trong vba excel 4

Mở Tab Developer > chọn Trình soạn thảo Visual Basic từ nhóm Code hoặc bạn cũng có thể nhấn tổ hợp phím Alt + F11 để mở VBA (trình soạn thảo trực quan cơ bản nơi chúng ta có thể viết mã) hoặc Nhấp chuột phải vào tên sổ làm việc, rồi chọn > View code, sau đó > nhấn vào Insert > chọn Module để chèn một mô-đun. Sau khi một mô-đun được chèn vào, chúng ta có thể viết mã của mình như sau:


Private Sub To_mau_nen()
Dim Rng As Range
Dim xcel As Range
Set Rng = Sheet1.Range("E3:E12")
For Each xcel In Rng
xcel.Interior.Color = RGB(156, 207, 212)
xcel.Font.Bold = True
xcel.Value = Round(xcel.Value, 0)
Next xcel
End Sub

Giải thích mã:

Trong macro, chúng tôi sử dụng Tập hợp phạm vi.

For Each xcel In Rng

………

Next xcel

Interior.Color áp đặt Tô màu.

xcel.Interior.Color = RGB(156, 207, 212)

Cuối cùng, sử dụng hàm ROUND trong VBA để làm tròn phạm vi ô.

xcel.Value = Round(xcel.Value, 0)

Quay trở lại trang tính và đảm bảo Chế độ thiết kế không được kích hoạt.

Nhấn phím F5 để chạy thủ tục, VBA sẽ tô màu các ô bằng Màu xanh lam nhạt, in đậm phông chữ và làm tròn các số đến số nguyên gần nhất.

Kết quả Đầu ra khi thực thi:

Hinh anh vong lap for each trong vba excel 5

Ví dụ 3: Lặp lại một phần thông qua một mảng.

Đối với ví dụ này, chúng ta sẽ tạo ra một loạt các ngôn ngữ lập trình. Trong vòng lặp For..Each, bạn có thể duyệt từng phần tử của mảng.

Đối với điều đó, bạn có thể sử dụng câu lệnh If và kiểm tra giá trị phần tử và thoát khỏi vòng lặp for nếu điều kiện được đáp ứng.

Mã lệnh:


Sub for_each_VD1()
   Dim arr_prog(1 To 6) As String
   Dim noi_chuoi As String
   Dim curr_item As Variant
   'Cac phan tu mang
   arr_prog (1) = "C#"
   arr_prog (2) = “JavaScript”
   Arr_prog(3) = "Java"
   Arr_prog(4) = "C++"
   Arr_prog(5) = "PHP"
   Arr_prog(6) = "Python"
   'Sử dụng vòng lặp For Each và thoát nếu ngôn ngữ hiện tại là “C++”
   For Each curr_item In Arr_prog
       If curr_item = "C++" Then
        Exit For
       End If
     noi_chuoi = noi_chuoi & curr_item & ", "
   Next curr_item
   MsgBox noi_chuoi
End Sub

Để chạy thủ tục trên đây. Các bạn nhấn chuột phải vào Sheet1 > chọn View code > cửa sổ soạn thảo mã VBA sẽ mở ra, các bạn nhấn vào Insert > chọn Module. Sau đó chép đoạn mã trên dán vào Module. Nhấn F5 để thực thi thủ tục.

Kết quả thực thi đầu ra như hình ảnh dưới đây:

Hinh anh vong lap for each trong vba excel 6

Bạn có thể thấy, chỉ có ba ngôn ngữ được hiển thị.

Ví dụ 4: Chỉ bỏ qua giải pháp lặp hiện tại thông qua một mảng.

Mặc dù câu lệnh continue không có sẵn trong VBA, cũng như trong các ngôn ngữ lập trình khác. Chúng ta có thể bỏ qua phần tử hiện tại (không thực thi bất kỳ đoạn mã nào).

Vì vậy, hãy xem xét lại mảng của chúng ta có sáu ngôn ngữ.

Trong đoạn mã bên dưới, chúng ta sẽ bỏ qua “C++” và cho phép hiển thị năm ngôn ngữ khác.

Mã VBA:


Sub for_each_VD2()
   Dim Arr_prog(1 To 6) As String
   Dim noi_chuoi As String
   Dim curr_item As Variant
   'Các phần tử của mảng
   Arr_prog(1) = "C#"
   Arr_prog(2) = “JavaScript”
   Arr_prog(3) = "Java"
   Arr_prog(4) = "C++"
   Arr_prog(5) = "PHP"
   Arr_prog(6) = "Python"

   'Chỉ bỏ qua vòng lặp khi điều kiện là True
   For Each curr_item In Arr_prog
       If curr_item = "C++" Then
        'Không làm gì cả
       Else
        noi_chuoi = noi_chuoi & curr_item & ", "
       End If
   Next curr_item
   MsgBox noi_chuoi
End Sub

Để chạy thủ tục trên đây. Các bạn nhấn chuột phải vào Sheet1 > chọn View code > cửa sổ soạn thảo mã VBA sẽ mở ra, các bạn nhấn vào Insert > chọn Module. Sau đó chép đoạn mã trên dán vào Module. Nhấn F5 để thực thi thủ tục.

Kết quả thực thi đầu ra như hình ảnh dưới đây:

Hinh anh vong lap for each trong vba excel 7

Bạn có thể thấy, mặc dù C++ là phần tử thứ tư theo thứ tự trong danh sách mảng, nhưng nó không được hiển thị trong hộp thông báo.

Ví dụ 5: Tạo dãy thông qua mảng

Mở Tab Developer > chọn Trình soạn thảo Visual Basic từ nhóm Code hoặc bạn cũng có thể nhấn tổ hợp phím Alt + F11 để mở VBA (trình soạn thảo trực quan cơ bản nơi chúng ta có thể viết mã) hoặc Nhấp chuột phải vào tên sổ làm việc, rồi chọn > View code, sau đó > nhấn vào Insert > chọn Module để chèn một mô-đun. Sau khi một mô-đun được chèn vào, chúng ta có thể viết mã của mình như sau:


Sub Tao_Day()
Dim myarray
Dim arr_pt
myarray = Array("red", "green", "blue", “yellow”, “purple”)
For Each arr_pt In myarray

    MsgBox "Gia tri cua mang la: " & arr_pt

Next arr_pt
End Sub

Giải thích mã:

Đầu tiên, chúng ta cần tạo một mảng, sau đó chúng ta có thể lặp qua nó.

Sử dụng phương thức For Each ...Next, để lặp qua mảng.

Tên của mảng là myarray và ở giữa vòng lặp, chúng ta có một dòng bắt đầu bằng MsgBox sẽ xuất nội dung của mảng vào một hộp thông báo. Phần MsgBox của mã này chỉ đơn giản là phần tạo đầu ra để chúng ta có thể thấy rằng vòng lặp này đang hoạt động.

Nhấn phím F5 để chạy thủ tục, VBA sẽ duyệt qua mảng và hiển thị thông báo thông qua hộp thoại Msgbox.

Kết quả Đầu ra khi thực thi:

Hinh anh vong lap for each trong vba excel 8

Đăng nhận xét