Excel VBA - вихід для циклу


181

Я хотів би вийти зі свого forциклу, коли буде виконана умова всередині. Як я міг вийти з forциклу, коли ifумова була виконана? Я думаю, якийсь вихід у кінці моєї ifзаяви, але не знаю, як це би спрацювало.

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 Forвсередині циклу
Dan

Відповіді:


333

Щоб вийти з циклу рано, ви можете скористатися Exit For

If [condition] Then Exit For


@nixda Будь ласка, видаліть свій коментар, оскільки гіперпосилання, яким ви поділилися, вказує на документацію VB.NET, а не на документацію Office VBA. ExitЗаява VBA має менше варіантів, ніж у VB.NET. Насправді VBA підтримує лише: Exit Do Exit For Exit Function Exit Propertyі Exit Sub. VBA не має Exit While. Правильне посилання: Office VBA Reference -Exit твердження
Excel Hero

@ExcelHero Готово
nixda

27

Ще один спосіб вийти з циклу For для початку - змінивши лічильник циклу:

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
Призначення лічильника циклу набагато менш надійний та майбутній доказ, ніж явний вихід із циклу. Перший може бути порушений зміною максимуму лічильника циклу, оскільки код модифікується, якщо редактор не помічає, що він також використовується в іншому місці. Це також не стосується For Eachциклів.
jpmc26

2
Це просто ще одне рішення питання, специфічного для Forциклу (не For Each). Професіонали та протидії застосовуються до різних рішень та різних ситуацій - наприклад, це більш надійний формат, ніж той, Go To labelякий гальмує логіку (неструктуроване програмування) або можливе вирішення Continueключового слова, відсутнього у VBA. Переваги Exit Forможна також поставити під сумнів, якщо логіка не виконує належну очистку об'єктів - погані реалізації тут не зовсім актуальні, хоча (@ jpmc26)
paul bica

0

Перша відповідь, подана з наступного, - це справді найкраща практика:

if i = 0 then exit for

Однак це також варіант:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.