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
CustomX
источник
13
If [condition] Then Exit Forв вашей петле
Дан

Ответы:

333

Чтобы выйти из цикла раньше, вы можете использовать Exit For

If [condition] Then Exit For

Дэн
источник
1
@nixda Пожалуйста, удалите свой комментарий, поскольку гиперссылка, которой вы поделились, указывает на документацию VB.NET, а не на документацию Office VBA. В Exitзаявлении VBA меньше вариантов, чем в VB.NET. На самом деле, VBA поддерживает только: Exit Do Exit For Exit Function Exit Propertyи Exit Sub. VBA не имеет Exit While. Правильная ссылка: Справочник по VBA в офисе
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)
Пол Бика
0

Первый ответ, приведенный ниже, действительно является лучшей практикой imo:

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
ko_00
источник