Thoát khỏi vòng lặp

vbano1

SMod
Thành viên BQT
Thỉnh thoảng tôi không tin vào mắt mình khi thấy chương trình của một số người được xử lý rất nhanh. Thật không thể nào tin được.
Ta ví dụ đoạn code dưới đây sẽ đi tìm kiếm các cells trong cột A nếu có ký tự "tuhocvba.net":
Mã:
Sub Sample()
    Dim i As Long, Target As Range
    For i = 1 To 1000
        If Cells(i, 1) = "tuhocvba.net" Then Set Target = Cells(i, 1)
    Next i
    'Sau do la doan chuong trinh xu ly voi Target
End Sub
Giả sử như ta tìm thấy A2 là ô cần tìm, tuy nhiên với code trên thì i vẫn phải chạy tới 1000 tức là dò xét tới tận ô A1000, điều này quả là việc vô ích, bởi vì ngay ở ô A2 đã tìm kiếm ra rồi.
Và vì vậy, chúng ta có một câu lệnh Exit mà tôi muốn mọi người nắm được.
Mã:
Sub Sample()
    Dim i As Long, Target As Range
    For i = 1 To 1000
        If Cells(i, 1) = "tuhocvba.net" Then Set Target = Cells(i, 1)
        Exit for 'Thoát khỏi vòng lặp for, không tìm kiếm nữa
    Next i
    'Sau do la doan chuong trinh xu ly voi Target
End Sub
Code ở trên tối ưu hơn chương trình ban đầu. Nếu nó tìm kiếm thấy, nó sẽ thoát khỏi vòng lặp For, không thực hiện tìm kiếm nữa.
Câu lệnh Exit này được dùng rất nhiều, không chỉ là Exit For, chúng ta còn thấy nó được sử dụng như Exit Do (Thoát vòng lặp Do Loop), Exit Function (thoát khỏi hàm), Exit Sub (thoát khỏi thủ tục).
Mã:
Sub Sample2()
    Dim buf As Long
    buf = ActiveCell.Value
    Call myProc(buf)
End Sub
Sub myProc(buf As Long)
    If buf < 1 Then
        MsgBox "Hay chi dinh so > 1", vbExclamation
        Exit Sub 'Thoát khỏi thủ tục myProc
    End If
    MsgBox buf * 100
End Sub
Dù là For Next hay For Each thì chúng ta đều sử dụng chung là Exit For để thoát khỏi vòng lặp.
Giống như lệnh If khi sử dụng lồng nhau, các bạn thường hỏi vậy biết Else tác dụng với If nào, thì câu trả lời là nó tác dụng với lệnh If gần nhất.
Tương tự như thế, nếu lệnh For được lồng nhau, thì Exit For sẽ có tác dụng với lệnh For gần nó nhất.
Ta hãy xem qua hình vẽ minh họa dưới đây:
Bạn cần đăng nhập để thấy đính kèm


Diễn đàn tự học vba (tuhocvba.net) tham khảo và dịch từ:
 
B

buiquangthuan

Guest
Nếu như Exit for đặt ở vị trí cuối cùng của Next i. cái này có bằng với việc không có exit for không thế ạ
 

Euler

Mod
Thành viên BQT
Nếu như Exit for đặt ở vị trí cuối cùng của Next i. cái này có bằng với việc không có exit for không thế ạ
Anh ơi, Exit For phải đặt vào trong For ~Next hoặc For~Each.
Mã:
For i = 1 to 10
    'TÌm kiếm gì đó
    Exit For
Next i
Nếu anh để thế này thì không còn tác dụng gì nữa.
Mã:
For i = 1 to 10
    'TÌm kiếm gì đó
    
Next i
Exit For
 
B

buiquangthuan

Guest
Cám ơn anh nhé. Có vẻ hiểu chút rồi. Để trong vòng lặp. Nếu nó chạy đến giá trị nào thỏa mãn điều kiện thì nó sẽ exit đúng không?
Nhưng nếu yêu cầu duyệt qua hết vòng lặp để đếm thì không được dùng exit for đúng không ạ
 

Euler

Mod
Thành viên BQT
Nhưng nếu yêu cầu duyệt qua hết vòng lặp để đếm thì không được dùng exit for đúng không ạ
Đúng. Nếu để đếm thì cứ tiến hành bình thường.
Dùng Exit khi mình cần kiểm tra sự tồn tại nào đó, nếu thấy nó tồn tại rồi thì Thoát cho nhanh.
 

Embevinhphuc

Thành viên mới
Theo em biết thì từ 2 vòng lặp trở nên là ko dùng được exit for rồi, lúc này phải dùng điều khiển go to hoặc biến tạm
 

bvtvba

Thành viên tích cực
Theo em biết thì từ 2 vòng lặp trở nên là ko dùng được exit for rồi, lúc này phải dùng điều khiển go to hoặc biến tạm
Bạn cho mình hỏi:
Mã:
Sub test_thvba()
    Dim i   As Integer
    Dim j   As Integer
  
    For i = 1 To 100 Step 1
        If ((i > 50) And (j > 50)) Then Exit For
        For j = 1 To 200 Step 1
            If (j = 52) Then Exit For
        Next j
    Next i
    MsgBox "So i la: " & i & "; So j la: " & j
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh


Bạn cần đăng nhập để thấy hình ảnh

Tại sao j không thể bằng 53? Có phải vì điều kiện thoát vòng lặp for j được thỏa mãn (khi j = 52) cho nên j =53 là điều không thể. Đúng hay sai?
Tại sao i không thể bằng 52? Có phải vì khi i = 51 và sau đó j = 52 thì điều kiện thoát for i được thỏa mãn do đó i=52 là điều không thể. Đúng hay sai?
Code trên sử dụng 2 vòng lặp for, đúng hay sai?

Ba câu hỏi trên chính là điều mình muốn phản biện lại kết luận vô căn cứ của bạn.
 

Embevinhphuc

Thành viên mới
Phản biện công phu quá, em sai rồi, tại em làm nó không thoát nên nói vậy.
 

Embevinhphuc

Thành viên mới
Các bác cho em hỏi sao trong vidu trên vòng lặp for không thoát ?
 

Euler

Mod
Thành viên BQT
Các bác cho em hỏi sao trong vidu trên vòng lặp for không thoát ?
Bạn dựa vào điều gì để khẳng định là vòng lặp For không thoát? Bạn có thể thuyết minh cho mọi người biết cơ sở đưa ra kết luận là vòng lặp for không thoát được thể hiện ở chỗ nào không?

Về cá nhân tôi, để biết for thoát hay không, tôi chèn thêm lệnh Msgbox:
Mã:
Sub tim_adress()
Dim i As Long
Dim j As Long
For i = 1 To 30
    For j = 1 To 20
        If Range("A1").Offset(i, j).Value = 1 Then
        Range("A1").Offset(i, j).Select
        End If
        Exit For
    Next
    Exit For
Next
MsgBox "So i la :" & i & "; So j la: " & j ''tuhocvba.net chèn thêm lệnh để kiểm tra
End Sub
Kết quả nó báo là i=1 và j = 1.
Vậy bây giờ câu hỏi đặt ra là tại sao i =30 không đạt được, thậm chí là i =2 cũng không đạt được?
Tương tự j =2 tại sao lại không đạt được?
Tôi đi đến kết luận vòng lặp for ở trên đã được thoát hoàn toàn.
 

Huytranwcr

Thành viên mới
Cho mình hỏi là nếu mình dùng vòng.lặp do loop while ở trong( có vòng lặp for next nhỏ ở trong nữa và vòng lặp for next ở ngoài thì khi mình dùng lệnh exit for thì có tác dụng lên vòng for ngoài ko hay vòng for nhỏ ở trong?
 

Huytranwcr

Thành viên mới
Bạn dựa vào điều gì để khẳng định là vòng lặp For không thoát? Bạn có thể thuyết minh cho mọi người biết cơ sở đưa ra kết luận là vòng lặp for không thoát được thể hiện ở chỗ nào không?

Về cá nhân tôi, để biết for thoát hay không, tôi chèn thêm lệnh Msgbox:
Mã:
Sub tim_adress()
Dim i As Long
Dim j As Long
For i = 1 To 30
    For j = 1 To 20
        If Range("A1").Offset(i, j).Value = 1 Then
        Range("A1").Offset(i, j).Select
        End If
        Exit For
    Next
    Exit For
Next
MsgBox "So i la :" & i & "; So j la: " & j ''tuhocvba.net chèn thêm lệnh để kiểm tra
End Sub
Kết quả nó báo là i=1 và j = 1.
Vậy bây giờ câu hỏi đặt ra là tại sao i =30 không đạt được, thậm chí là i =2 cũng không đạt được?
Tương tự j =2 tại sao lại không đạt được?
Tôi đi đến kết luận vòng lặp for ở trên đã được thoát hoàn toàn.
Giả sử mình dùng exit for như sau:
Tong = 0
For i = 1 to 323
Do
For j = 2 to 56
If ..... then....
Else
....
Next j
Loop while j = 56
Tong = tong + 1
If tong > 100 then
Exit for
Next i
Thì lệnh exit tác dụng cho vòng lặp for nào
 

NhanSu

Thành Viên Nổi Bật

Lệnh Exit for sẽ có tác dụng với lệnh Next ở dưới gần nhất thôi bạn. Để xem vòng lặp hoạt động thế nào, bạn bấm F8 để chạy từng lệnh và quan sát các biến đếm trong Local window.
 

BGuz

Thành viên mới
Tôi có thể không hiểu câu hỏi nhưng:
Vì vậy, đây là một mã làm việc (vấn đề ở đây là gì?):

Sub tim_adress()
Dim i As Long
Dim j As Long
For i = 1 To 30
For j = 1 To 20
If Range("A1").Offset(i, j).Value = 1 Then
Range("A1").Offset(i, j).Select
Exit For
End If
Next
If Range("A1").Offset(i, j).Value = 1 Then Exit For
Next
MsgBox "So i la :" & i & "; So j la: " & j ''tuhocvba.net chen them l?nh đ? ki?m tra
End Sub
 
Top