Excel VBA - keluar untuk loop


181

Saya ingin keluar dari forloop saya ketika kondisi di dalamnya terpenuhi. Bagaimana saya bisa keluar dari forloop saya ketika ifkondisi telah terpenuhi? Saya pikir semacam jalan keluar di akhir ifpernyataan saya , tetapi tidak tahu bagaimana itu akan berhasil.

Dim i As Long
For i = 1 To 50
    Range("B" & i).Select
    If Range("B" & i).Value = "Artikel" Then
        Dim temp As Long
        temp = i
    End If
Next i
Range("A1:Z" & temp - 1).EntireRow.Delete Shift:=xlToLeft

13
If [condition] Then Exit Fordi dalam lingkaran Anda
Dan

Jawaban:


333

Untuk keluar dari loop Anda lebih awal, Anda dapat menggunakan Exit For

If [condition] Then Exit For


1
@nixda Harap hapus komentar Anda, sebagai hyperlink yang Anda bagikan poin ke dokumentasi VB.NET, bukan dokumentasi Office VBA. ExitPernyataan VBA memiliki opsi lebih sedikit daripada VB.NET. Bahkan, VBA hanya mendukung: Exit Do Exit For Exit Function Exit Propertydan Exit Sub. VBA tidak punya Exit While. Tautan yang benar adalah: Referensi VBA Office
Excel Hero

@ExcelHero Done
nixda

27

Cara lain untuk keluar dari For loop lebih awal adalah dengan mengubah penghitung loop:

For i = 1 To 10
    If i = 5 Then i = 10
Next i

Debug.Print i   '11

For i = 1 To 10
    If i = 5 Then Exit For
Next i

Debug.Print i   '5

3
Menetapkan penghitung lingkaran jauh lebih kuat dan bukti di masa mendatang daripada secara eksplisit keluar dari loop. Yang pertama dapat dipecah oleh perubahan maksimum penghitung loop karena kode dimodifikasi jika editor tidak melihat itu juga digunakan di tempat lain. Ini juga tidak berlaku untuk For Eachloop.
jpmc26

2
Ini hanyalah solusi untuk pertanyaan khusus untuk Forloop (bukan For Each). Pro dan kontra berlaku untuk solusi yang berbeda dan situasi yang berbeda - misalnya ini adalah format yang lebih kuat daripada Go To labelyang mengerem logika (pemrograman non-terstruktur), atau kemungkinan penyelesaian Continuekata kunci, hilang dalam VBA. Kelebihan dari Exit Fordapat dipertanyakan juga jika logika tidak melakukan pembersihan objek yang tepat - implementasi yang buruk tidak cukup relevan di sini (@ jpmc26)
paul bica

0

Jawaban pertama yang diberikan berikut ini memang merupakan praktik terbaik:

if i = 0 then exit for

Namun, ini juga merupakan opsi:

Sub some()

Count = 0
End_ = ThisWorkbook.Sheets(1).Range("B1047854").End(xlUp).Row

While Count < End_ And Not ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel"
    Count = Count + 1
    If ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel" Then
        ThisWorkbook.Sheets(1).Range("A1:Z" & Count - 1).EntireRow.Delete Shift:=xlToLeft
    End If
Wend

End Sub
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.