Bạn muốn làm gì khi bạn cần lặp nhưng không biết số lần mà bạn cần lặp ? Điều này có thể xảy ra, chẳng hạn: Bạn muốn lặp lại cho đến khi một điều kiện cụ thể nào thỏa mãn, chẳng hạn như gặp một ô trống trong một bảng tính Excel.
Vòng lặp là một phần không thể thiếu của bất kỳ ngôn ngữ lập trình nào và bạn có thể tự động hóa nhiều tác vụ lặp đi lặp lại bằng cách sử dụng nhiều vòng lặp khác nhau, tùy thuộc vào ngôn ngữ hiện có. VBA của Excel không khác với các VBA khác vì nó cung cấp một loạt các tùy chọn lặp, mỗi tùy chọn phục vụ một mục đích khác nhau.
Bạn có thể sử dụng các vòng lặp này bằng cách xác định điểm bắt đầu và điểm kết thúc, các điều kiện và tham số. Một vòng lặp nổi bật như vậy trong VBA là vòng lặp do...while mà bạn có thể sử dụng để làm việc với tự động hóa dữ liệu.
Vòng lặp do...while khá đơn giản; bạn có thể sử dụng vòng lặp này nếu bạn muốn dựa trên một điều kiện cụ thể. Vòng lặp thực hiện cho đến khi (các) điều kiện được xác định là đúng. Khi chương trình gặp giá trị Sai, vòng lặp sẽ kết thúc và in kết quả trong các ô được chỉ định.
Bạn có thể sử dụng vòng lặp do...while trong các giai đoạn khác nhau và với các tiêu chí khác nhau; bạn thậm chí có thể sử dụng nhiều vòng lặp bên trong vòng lặp chính bên ngoài để nâng cao khả năng sử dụng của nó.
Vòng lặp Do…While được sử dụng khi chúng ta muốn lặp lại một tập hợp các câu lệnh miễn là điều kiện còn đúng. Điều kiện có thể được kiểm tra ở đầu vòng lặp hoặc ở cuối vòng lặp.
Cú pháp Do... While ...Loop
Sau đây là cú pháp của vòng lặp Do…While trong VBA Excel.
Do While Điều kiện
[Câu lệnh thực thi 1]
[Câu lệnh thực thi 2]
....
[Câu lệnh thực thi n]
[Exit Do]
[Câu lệnh thực thi 1]
[Câu lệnh thực thi 2]
....
[Câu lệnh thực thi n]
Loop
Trong đó:
● Từ khóa Do (bắt buộc) : Để bắt đầu cho vòng lặp Do.
● Từ khóa While (bắt buộc): Lặp lại vòng lặp cho đến khi điều kiện sai (chỉ dừng lại khi điều kiện chuyển từ đúng sang sai).
● Điều kiện: là 1 cấu trúc so sánh mà kết quả của phép so sánh đó luôn trả về giá trị Đúng hoặc Sai. Là điều kiện do bạn chỉ định, và điều kiện này phải đúng thì vòng lặp mới chạy được.
● Câu lệnh thực thi : Các dòng mã bạn muốn Do… While… Loop thực thi điều kiện là đúng.
● Exit Do (không bắt buộc) : thường được sử dụng sau khi đánh giá một số điều kiện, bạn muốn thoát vòng lặp trước. Trong trường hợp đó, bạn sẽ thoát vòng lặp tại vị trí được đặt từ khóa này, thường đặt sau câu lệnh thực thi.
● Loop (bắt buộc) : Đó là câu lệnh kết thúc một lần lặp của vòng lặp và yêu cầu VBA quay lại để kiểm tra lại điều kiện.
Sơ đồ khối:
Ví dụ 1: Sử dụng vòng lặp Do..While để đánh số thứ tự cho cột A từ 1 đến 10
Để làm như vậy, hãy điều hướng đến tab Developer (Nhà phát triển) trên Excel của bạn và mở trình chỉnh sửa mã hóa; cách khác, nhấn Alt + F11 để mở trực tiếp trình chỉnh sửa mã hóa. Trong cửa sổ trình chỉnh sửa mã, nhấp vào tab Insert (Chèn) và thêm một Module (mô-đun) mới.
Bạn cần viết tất cả mã trong cửa sổ mô-đun này. Thêm mã sau vào bên trong mô-đun:
Sub Do_While_VD1()
Dim i As Integer
i = 1
Do While i <= 10
Range("A" & i) = i
i = i + 1
Loop
End Sub
Giải thích mã:
Dưới đây là bảng phân tích mã để giúp bạn nắm vững kiến thức cơ bản:
Sử dụng thường trình con (Sub): Để bắt đầu viết mã trong Excel VBA, hãy tạo một thủ tục với chức năng thường trình con (Sub). Đặt cho nó một cái tên có ý nghĩa, phù hợp với mục đích của mã. Trong ví dụ này, bạn có thể sử dụng tên Do_While_VD1, theo sau là cặp ngoặc đơn ().
Xác định kiểu dữ liệu (Data types): Từ khóa dim được sử dụng để khai báo các kiểu dữ liệu của biến. Bằng cách khai báo kiểu dữ liệu, bạn có thể làm cho mã của mình hiệu quả và cải thiện tốc độ thực thi. Trong trường hợp này, biến i lưu trữ các giá trị nguyên, vì vậy hãy sử dụng kiểu dữ liệu số nguyên để định nghĩa nó. Bạn có thể lưu trữ số hàng bắt đầu trong biến này, để khai báo điểm dữ liệu bắt đầu của vòng lặp do...while.
Xác định Điều kiện (Condition): Bây giờ, đã đến lúc chuyển điều kiện để kiểm soát vòng lặp do...while. Bạn có thể sử dụng từ khóa do while theo sau là điều kiện. Vì bạn muốn chạy vòng lặp mười lần, bạn sử dụng điều kiện i < = 10.
Truyền các câu lệnh có thể thực thi (Statements): Sử dụng đối tượng Range để tham chiếu hàng và cột trong VBA. Ví dụ: trong lần lặp đầu tiên, khi giá trị của i = 1, công thức ô là (1,1). Trong bộ nhớ của VBA, điều này chuyển thành ô A1. Mỗi khi vòng lặp thực thi, giá trị của biến đã xác định sẽ tăng lên và tham chiếu sẽ di chuyển đến ô có sẵn tiếp theo.
Tăng biến đếm: Bạn có thể chuyển câu lệnh i = i + 1 để tăng giá trị ô. Thao tác này sẽ chuyển vòng lặp sang phần tiếp theo của điều kiện; vòng lặp tiếp tục chạy cho đến khi điều kiện phát sinh giá trị Sai.
Thoát khỏi điều kiện Vòng lặp: Khi điều kiện là Sai, vòng lặp sẽ thoát với từ khóa Vòng lặp (Loop) và cuối cùng, nó sẽ thoát khỏi thủ tục với từ khóa End Sub.
Thực thi mã: Vì mã đã sẵn sàng, chỉ cần nhấn phím F5 hoặc nút phát màu xanh lục trên thanh menu trên cùng để thực thi mã.
Kết quả thực thi hiển thị danh sách các số từ 1-10 trong cột A, như sau:
Ví dụ 2: Sử dụng câu lệnh IF trong vòng lặp Do..While
Giống như các vòng lặp lồng nhau, bạn có thể sử dụng câu lệnh IF trong vòng lặp Do...While để thêm một lớp điều kiện khác. Trong trường hợp như vậy, vòng lặp do...while sẽ chạy toàn bộ vòng lặp cho đến khi điều kiện là Sai và câu lệnh IF bên trong sẽ thực thi mỗi khi vòng lặp chạy.
Trong ví dụ dưới đây, vòng lặp do...while chạy qua từng ô trong cột C, cho đến khi nó gặp một ô trống. Sau đó, câu lệnh IF kiểm tra giá trị của từng ô trong cột C và in kết quả ra trong cột D. Ngay khi vòng lặp bên ngoài gặp một ô trống trong cột C, vòng lặp sẽ dừng và thoát khỏi thủ tục.
Bạn cần viết tất cả mã trong cửa sổ mô-đun này. Thêm mã sau vào bên trong mô-đun:
Sub Do_While_Loop_VD2()
Dim i As Integer
i = 2
Do While Cells(i,3)<>vbnullstring
If Cells(i,3).Value <= 5 Then
Cells(i,4).Value = “Fail”
Else
Cells(i,4).Value = “Pass”
End If
i = i + 1
Loop
End Sub
Kết quả đầu ra như sau:
Giải thích đoạn mã trên như sau:
Cho đến khi giá trị trong cột C nhỏ hơn 5, giá trị kết quả trong cột D là “Fail”. Trong các ô ở cột C, nếu giá trị ô lớn hơn 5 thì kết quả đầu ra là ô ở cột D được ghi là “Pass”, tức là đồng bộ với điều kiện IF.
Ví dụ 3:
Bằng cách sử dụng vòng lặp do... while, giáo viên sẽ thiết lập nhận xét về kết quả học tập của học sinh. Ở đây, chúng ta sử dụng vòng lặp do.. while và thiết lập một câu lệnh thông qua đó mã VBA sẽ hoạt động cho tập dữ liệu. Để hiển thị phương pháp này, chúng ta lấy một tập dữ liệu bao gồm tên và điểm của một số học sinh.
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ở. Nhấn vào Insert > chọn Module. Hãy nhập đoạn code sau:
Sub Do_While_Loop_Offset()
Dim i As Integer
Dim Lr as long
i = 5
Lr = Range(“A” & Rows.Count).End(xlUp).Row + 1
Do While i < Lr
If Range("C" & i).Value < 50 Then
Range("C" & i).Offset(0, 1).Value = "Khong dat"
Else
Range("C" & i).Offset(0, 1).Value = "Dat"
End If
i = i + 1
Loop
End Sub
Nhấn phím F5 hoặc nút phát màu xanh lục trên thanh menu trên cùng để thực thi mã.
Kết quả là, chúng tôi sẽ nhận được các nhận xét cần thiết từ các điểm sinh viên đã cho.
Trong trường hợp này, vòng lặp do..while xác minh tất cả các trường hợp và đưa ra nhận xét mong muốn.
Giải thích mã:
Sub Do_While_Loop_Offset()
Trước hết, cung cấp tên cho thủ tục phụ của macro.
Dim i As Integer
Dim Lr as long
i = 5
Tiếp theo, khai báo biến cần thiết cho macro. Sau đó, đặt giá trị ban đầu của i.
Lr = Range(“A” & Rows.Count).End(xlUp).Row
Lấy tổng số dòng cuối cùng của cột A cộng thêm 1 và gán cho biến Lr
Do While i < Lr
If Range("C" & i).Value < 50 Then
Range("C" & i).Offset(0, 1).Value = "Khong Dat"
Else
Range("C" & i).Offset(0, 1).Value = "Dat"
End If
i = i + 1
Loop
Sau đó, chúng tôi sử dụng vòng lặp do..while trong đó giá trị của i nhỏ hơn Lr. Sau đó, chúng tôi sử dụng điều kiện If trong đó nếu giá trị phạm vi nhỏ hơn 50, nó sẽ trả về giá trị “Không đạt” trong cột tiếp theo (cột D) bằng cách sử dụng offset. Nếu không, nó sẽ trả về “Đạt” trong cột tiếp theo (cột D) bằng cách sử dụng offset. Tiếp theo, tăng biến đếm i thêm 1 đơn vị. Quá trình này sẽ tiếp tục cho đến khi điều kiện trở thành sai (i=Lr).
End Sub
Cuối cùng, kết thúc thủ tục của macro.
Cú pháp thay thế Do ... Loop ... While
Ngoài ra còn có một Cú pháp thay thế cho vòng lặp Do…while để kiểm tra điều kiện ở cuối vòng lặp.
Do
[Câu lệnh thực thi 1]
[Câu lệnh thực thi 2]
....
[Câu lệnh thực thi n]
[Exit Do]
[Câu lệnh thực thi 1]
[Câu lệnh thực thi 2]
....
[Câu lệnh thực thi n]
Loop While Điều kiện
Trong đó:
Từ khóa Do (bắt buộc): Nó là từ khóa bắt đầu cho Do Loop While.
Câu lệnh thực thi: Đó là (các) dòng mã mà bạn muốn chạy trong vòng lặp.
Từ khóa Loop While (bắt buộc): Là từ khóa để tiếp tục vòng lặp và kiểm tra điều kiện mà bạn đã chỉ định.
Điều kiện: đó là điều kiện mà bạn muốn kiểm tra trước khi vòng lặp bắt đầu lần lặp thứ hai và tiếp tục vòng lặp.
Như bạn có thể thấy trong cú pháp của Do Loop While, trước tiên nó sẽ chạy câu lệnh một lần và sau đó, nó sẽ đi đến điều kiện và kiểm tra nó, và nếu điều kiện đó là đúng, nó sẽ bắt đầu vòng lặp và tiếp tục nó trong khi điều kiện là đúng.
Sơ đồ khối:
Ví dụ 1: Hãy viết mã để hiển thị hộp nhập liệu và yêu cầu người dùng nhập mật khẩu. Hộp nhập đó sẽ tiếp tục hiển thị mật khẩu do người dùng nhập không chính xác cho đến ba lần nhập và sau đó, hộp nhập liệu sẽ biến mất mà không cần chạy thủ tục.
Viết đoạn mã lệnh sau đây:
Sub do_loop_while_input_pass()
Dim xlPass As Variant, i As Double
i=0
Do
xlPass = InputBox ("Ban hay nhap mat khau vao o:", "Kiem tra mat khau")
i = i + 1
Loop While xlPass <> "123456" And i < 3
If xlPass = "123456" Then
MsgBox "Ban da nhap mat khau chinh xac!!"
End If
End Sub
Kết quả đầu ra như sau:
Giải thích mã:
Trong phần đầu tiên của đoạn mã này, bạn có vòng lặp do...loop while sẽ hiển thị hộp nhập liệu cho người dùng và yêu cầu nhập mật khẩu.
Và nếu nhập mật khẩu không chính xác, nó sẽ tiếp tục chạy vòng lặp cho đến khi người dùng nhập đúng mật khẩu.
Nhưng vì bạn đang sử dụng bộ đếm để đếm số lần lặp lại của vòng lặp và khi bộ đếm đó đạt đến 3, vòng lặp sẽ dừng lại.
Ví dụ 2: Nhập ngày cho tháng hiện tại.
Giả sử bạn chỉ muốn nhập 10 ngày đầu tiên của tháng hiện tại vào một cột trong trang tính. Bạn có thể làm điều đó bằng cách sử dụng mã vòng lặp Do... Loop While sau:
Sub do_loop_while_input_Dates()
Dim CMDate As Date
Dim i As Integer
i = 0
CMDate = DateSerial(Year(Date), Month(Date), 1)
Do
Range("C1").Offset(i, 0) = CMDate
i = i + 1
If i >= 10 Then Exit Do
CMDate = CMDate + 1
Loop While Month(CMDate) = Month(Date)
End Sub
Kết quả thực thi thủ tục trên:
Giải thích mã:
Đoạn mã trên sẽ nhập 10 ngày vào cột thứ ba của trang tính (bắt đầu từ ô C1). Các vòng lặp tiếp tục cho đến khi giá trị tháng của biến 'CMDate' khớp với giá trị của tháng hiện tại.
Câu lệnh IF được sử dụng để kiểm tra xem giá trị của i có lớn hơn 10 hay không. Ngay khi giá trị của 'i' trở thành 10, câu lệnh “Exit Do” được thực hiện và vòng lặp kết thúc.
Tham khảo các chủ đề có liên quan khác: