Trong bài viết này, chúng tôi đã đề cập đến các loại vòng lặp khác nhau được sử dụng trong VBA và cách sử dụng chúng để thực hiện cùng một nhiệm vụ theo những cách khác nhau.

Tại sao lại lặp lại?

Vòng lặp là một trong những kỹ thuật lập trình mạnh mẽ nhất được sử dụng trên nhiều ngôn ngữ lập trình. Vòng lặp được sử dụng để lặp lại một khối mã trong số lần cần thiết hoặc cho đến khi một điều kiện nhất định được đánh giá là đúng hoặc đạt đến một giá trị cụ thể, sau đó khối mã tiếp theo được thực thi.

Mục đích của vòng lặp VBA trong Excel là làm cho Excel lặp lại một đoạn mã với số lần nhất định. Người ta có thể chỉ định số lần mã phải được lặp lại dưới dạng một số cố định (ví dụ: thực hiện điều này 10 lần) hoặc dưới dạng một biến (ví dụ: làm điều này bao nhiêu lần khi có hàng dữ liệu).

Vòng lặp Excel có thể được xây dựng theo nhiều cách khác nhau để phù hợp với các trường hợp khác nhau. Thông thường, có thể thu được cùng một kết quả theo nhiều cách khác nhau để phù hợp với sở thích cá nhân của bạn.

Có ba loại vòng lặp khác nhau có sẵn trong Excel VBA, đó là:

  1. DO UNTIL Loop 2. DO WHILE Loop 3. FOR Loop {trống} 1. Vòng lặp DO UNTIL Vòng lặp DO UNTIL được sử dụng để lặp lại một khối mã vô thời hạn, cho đến khi điều kiện được chỉ định được đặt thành True. Điều kiện có thể được kiểm tra ở đầu hoặc cuối của Vòng lặp. Câu lệnh DO UNTIL… LOOP kiểm tra điều kiện ở đầu, trong khi câu lệnh DO… LOOP UNTIL kiểm tra điều kiện ở cuối Vòng lặp.

Cú pháp của câu lệnh DO UNTIL… LOOP

Làm cho đến khi [Điều kiện]

{trống} [Khối mã được lặp lại]

Vòng lặp

Cú pháp của câu lệnh DO… LOOP UNTIL

Làm {trống} [Khối mã được lặp lại]

Loop Until [Điều kiện]

Chúng tôi đã giải thích vòng lặp DO… UNTIL với một ví dụ. Macro Loop1 và Loop2 được sử dụng để tính giá trị trung bình của các số trong cột A và cột B bằng vòng lặp DO… UNTIL.

Dữ liệu mẫu có trong phạm vi A15: B27. Cột A chứa điểm của Vòng 1 và cột B chứa điểm của Vòng 2. Chúng ta muốn tính trung bình của điểm trong Vòng 1 và Vòng 2 trong cột C.

Sample1

Trong macro Loop1, chúng tôi đã sử dụng “FormulaR1C1” để chèn công thức trung bình vào ô hiện hoạt. Câu lệnh điều kiện trong vòng lặp DO UNTIL được kiểm tra ở cuối vòng lặp.

Trong macro Loop2, chúng tôi đã sử dụng “WorksheetFunction.Average” để chèn giá trị trung bình vào ô hiện hoạt. Ngay cả trong macro này, câu lệnh điều kiện được kiểm tra ở cuối vòng lặp.

Sự khác biệt duy nhất giữa macro Loop1 và Loop2 là Loop1 chèn công thức trung bình, trong khi Loop2 tính giá trị trung bình và sau đó chèn giá trị trung bình vào ô hiện hoạt.

OutputSample1

{trống} 2. Vòng lặp DO WHILE Vòng lặp DO WHILE được sử dụng để lặp lại một khối mã không giới hạn số lần, trong khi điều kiện được chỉ định tiếp tục là Đúng và dừng khi điều kiện trả về Sai. Điều kiện có thể được kiểm tra ở phần đầu hoặc phần cuối của Vòng lặp. Câu lệnh DO WHILE… LOOP kiểm tra điều kiện ngay từ đầu, trong khi câu lệnh DO… LOOP WHILE kiểm tra điều kiện ở cuối vòng lặp. Câu lệnh DO… LOOP WHILE được sử dụng khi chúng ta muốn vòng lặp chạy khối mã ít nhất một lần trước khi kiểm tra điều kiện.

Cú pháp của câu lệnh DO WHILE… LOOP

Làm trong khi [Điều kiện]

{trống} [Khối mã được lặp lại]

Vòng lặp

Cú pháp của câu lệnh DO… LOOP WHILE

Làm {trống} [Khối mã được lặp lại]

Vòng lặp trong khi [Điều kiện]

Trong ví dụ này, macro Loop3 và Loop4 được sử dụng để tính trung bình cho các giá trị trong các ô của cột A và cột B. Cả hai macro đều hoạt động trên cùng một dữ liệu mẫu như được sử dụng bởi macro Loop1 và Loop2. Cả hai đều sử dụng câu lệnh DO WHILE để lặp qua phạm vi chứa dữ liệu.

Sự khác biệt duy nhất giữa macro Loop3 và Loop4 là chúng là những cách khác nhau để biểu diễn các điều kiện của vòng lặp DO WHILE.

Vì macro Loop3 và Loop4 sử dụng dữ liệu đầu vào giống nhau và thậm chí thực hiện các chức năng tương tự như macro Loop1, do đó đầu ra trả về cũng sẽ giống như macro Loop1.

{trống} 3. Vòng lặp FOR Vòng lặp For được sử dụng để lặp lại một khối mã cho một số lần cụ thể.

Cú pháp của vòng lặp FOR

Đối với count_variable = start_value Đến end_value [khối mã]

Macro count_variable Loop5 tiếp theo chỉ ra cách sử dụng vòng lặp FOR để tính giá trị trung bình. Nó cũng sử dụng cùng một dữ liệu mẫu được sử dụng bởi các macro khác. Chúng tôi đã sử dụng 15 làm giá trị bắt đầu vì dữ liệu mẫu bắt đầu từ hàng thứ 15 ^. Chúng tôi đã sử dụng Range (“A” & Cells.Rows.Count) .End (xlUp) .Row để tìm hàng cuối cùng chứa dữ liệu. Vòng lặp FOR sẽ lặp lại (lastcell- 15) số lần.

Kết quả trả về sau khi chạy macro Loop5 giống với macro Loop1.

Macro Loop6 được tạo để tính giá trị trung bình, chỉ khi ô hiện hoạt có chức năng trung bình bị trống trước khi chạy macro.

Dữ liệu mẫu cho macro này có trong phạm vi E15 đến G27.

Sample2

Chúng tôi đã sử dụng DO… LOOP WHILE để lặp qua phạm vi đã xác định. Câu lệnh IF được sử dụng để kiểm tra xem ô nơi hàm sẽ được chèn có chứa giá trị hay không. Macro này sẽ chèn hàm trung bình vào ô chỉ khi nó trống.

OutputSample2

Macro Loop7 cũng được sử dụng để tính toán trung bình. Nó kiểm tra các giá trị trong cột trợ giúp trước khi đánh giá xem có lặp lại hay không. Nó cũng kiểm tra xem tham chiếu ô sẽ được sử dụng trong hàm trung bình có trống hay không.

Dữ liệu mẫu được sử dụng cho macro Loop7 nằm trong phạm vi J15: M27.

Sample3

Cột M được sử dụng làm cột trợ giúp. Macro này sẽ chỉ chèn một hàm trung bình nếu một ô trong cột M không trống. Macro này kiểm tra xem một ô phải trống trước khi chèn một hàm trung bình vào đó. Nó sẽ không chèn một hàm trung bình nếu ô được tham chiếu trong hàm trung bình trống.

OutputSample3

Vui lòng theo dõi bên dưới để biết mã

Option Explicit

Sub Loop1()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

Range("C15").Select

Do

'Assigning average function on value in cells of previous two consecutive columns

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

'Checking whether value in cell of previous column is empty

'Do Until loop will loop until condition statement returns True

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop2()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'This macro is similar to macro Loop1, only way of calculating average is different

Range("C15").Select

Do

'Worsheet.Average function is used for calculating the average

ActiveCell.Value = WorksheetFunction.Average(ActiveCell.Offset(0, -1).Value, _

ActiveCell.Offset(0, -2).Value)

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop3()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

Range("C15").Select

'Checking whether value in cell of previous column is empty

'Do While loop will loop until condition statement is True

Do While IsEmpty(ActiveCell.Offset(0, -1)) = False

'Assigning average function on value in cells of previous two consecutive column

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop4()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

'This macro is similar to macro Loop3, only way of applying condition is different

Range("C15").Select

Do While Not IsEmpty(ActiveCell.Offset(0, -1))

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop5()

'FOR loop repeats for a fixed number of times determined by the number of rows

Dim i, lastcell As Long

'Finding the last row containing data in column A

lastcell = Range("A" & Cells.Rows.Count).End(xlUp).Row

Range("C15").Select

'i variable is assigned value of 15 as our sample data begin from 15th row

'FOR Loop will loop x

For i = 15 To lastcell

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Next i

Range("A15").Select

End Sub

Sub Loop6()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'It does not calculate an average if there is already something in the cell

Range("G15").Select

Do

If IsEmpty(ActiveCell) Then

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("E15").Select

End Sub

Sub Loop7()

'Do Until loop runs as long as there is something in cell in next column

'It does not calculate an average if there is already something in the active cell

'Nor if there is no data in cells which are used within average function (to avoid #DIV/0 errors).

'Calculating average

Range("L15").Select

Do

If IsEmpty(ActiveCell) Then

If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(0, -2)) Then

ActiveCell.Value = ""

Else

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, 1))

Range("J15").Select

End Sub

Nếu bạn thích blog này, hãy chia sẻ nó với bạn bè của bạn trên Facebook và Facebook.

Chúng tôi rất muốn nghe ý kiến ​​từ bạn, hãy cho chúng tôi biết cách chúng tôi có thể cải thiện công việc của mình và làm cho nó tốt hơn cho bạn. Viết thư cho chúng tôi [email protected]