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

Administrator
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

Administrator
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.
 
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

bvtvba

Guest
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.
 
Các bác cho em hỏi sao trong vidu trên vòng lặp for không thoát ?
 

Euler

Administrator
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

Yêu THVBA
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

Yêu THVBA
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:
Mã:
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

SMod
Thành viên BQT
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

VIP

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ì?):
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
                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
 
T

thanhphong

Guest
@BGuz: Here is just explaining which command [Exit For] corresponds to which command [For]
Vietnamese: Ở đây chỉ là giải thích lệnh Exit For tương ứng với lệnh For nào.
Bạn cần đăng nhập để thấy đính kèm
 
Top