Страницы: 1
RSS
vba. Как перейти на следующий шаг в цикле, не выполняя дальнейших дкействий
 
Добрый день.

Есть цикл for, в нем много условий и действие.
Я хочу, чтобы при определенном условии дальнейшие условия не проверялись вообще и переходить к следующему шагу.
Делать многоуровневые конструкции if else не хочется. При проверке каждого условия хочется быть уверенным, что предыдущие условия выдали положительный ответ.
Заранее спасибо.
Код
For i = 1 To 5
        
        q = False
        
        If 1 = 1 Then
            q = True
        Else
            If 1 > 2 Then
                q = True
            Else
                '   перейти к следующему шагу
            End If
        End If
        
        If 3 = 3 Then
            q = True
        Else
            '   перейти к следующему шагу
        End If
        
        
        If 5 = 6 Then
            q = True
        Else
            '   перейти к следующему шагу
        End If
        
        
        If q Then Debug.Print "выполняем действие"
        
    Next
 
Go to?
Еще может имеет смысл присмотреться к Select Case. Но не зная конечной цели сложно точно сказать, подойдет или нет.
ElseIf тоже никто не отменял.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
как может быть 1 > 2 и 5 = 6?
 
The_Prist,
Go to почему-то все настоятельно рекомендуют не использовать в циклах
Select Case не поможет в моей ситуации

В каждом условии буду вдобавок проверять результат предыдущего условия, пока так...  
 
Continue For
https://msdn.microsoft.com/en-us/library/z6zekeaa(v=vs.100).aspx

Хотя это для VB. Не знаю, будет ли в VBA работать.



Update: Попробовал, не работает в VBA.
Изменено: Equio - 01.08.2017 19:36:30
 
Цитата
Nik021 написал:
Select Case не поможет в моей ситуации
- как часто слышали это в разных вариантах :)
 
Цитата
Nik021 написал:
Go to почему-то все настоятельно рекомендуют не использовать
значит не используйте, раз Вам так рекомендуют :) Я иногда использую. К слову, если бы это было совсем уж "неграмотно" - его бы не было и в более серьезных языках. Но он там есть. Главное использовать правильно, чтобы эти GoTo не не ломали читаемость кода и главное - были оправданы. Потому как некоторые пихают их там, где без них можно обойтись более чем.
Выбора за Вами.
По поводу Select Case - уже говорил. И Hugo прав - иногда за этим "не поможет" часто стоит просто незнание всех возможностей этой конструкции. Не более.
Да и в любом случае - не видя реальной задачи подсказать больше нечего.
Изменено: The_Prist - 01.08.2017 19:39:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, я искал легкий способ прекратить дальнейшее выполнение кода и перехода к следующему шагу цикла, как, например, exit for (exit полностью завершает цикл, но вы поняли). Рас так просто нельзя, то буду использовать другие доступные варианты. Спасибо.
 
В таких случаях внутри цикла For...Next делается замкнутый Do...Loop с командой выхода в конце. Любое условие, при котором нужно перейти к следующему шагу Next, выполняет Exit Do.
 
Цитата
Nik021 написал:
Select Case не поможет в моей ситуации
А мне кажется, что Select Case именно то, что Вам нужно.
 
Юрий М, Select Case, на сколько я помню, проверяет только числа, а строковые значение сравнивать не умеет или я что-то путаю уже.

Влад, а вот это уже интересная идея !)
 
Цитата
Nik021 написал:
или я что-то путаю уже.
Или )
 
Цитата
Nik021 написал:
на сколько я помню, проверяет только числа
что-то Вы не то помните. Эта конструкция принимает не просто и числа и текст, но и очень такие выражения в качестве условий, для которых в If ... then надо будет городить доп.условия.
Идея с Do .. Loop не очень хорошая. Делать цикл только ради того, чтобы перескочить к концу другого цикла - это уже перебор. Уж в таких случаях куда оправданнее будет тот же GoTo, чем Exit Do в тех же места, не считаете?
Изменено: The_Prist - 02.08.2017 09:03:02
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Не перевариваю GoTo
 
Цитата
Влад написал:
Не перевариваю GoTo
Это выбор каждого :) И если мне приведут вменяемое обоснование, чем он так плох - может тоже не буду использовать. Пока что не нашел причин отказываться от него совсем, особенно в ситуациях, где с ним процедура намного лаконичнее, читабельнее и быстрее, чем без него.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
и тем более GOTO логически и визуальнео очень органично встраивается в представленнй макрос
достаточно заменить комментарии '   перейти к следующему шагу на GOTO Метка, а саму метку поставить перед Next
Скрытый текст
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
логически и визуальнео очень органично встраивается
тоже сделает ElseIf конструкция без всяких гот и меток ;)
Я сам - дурнее всякого примера! ...
 
Уважаемые знатоки vba!

Помогите пожалуйста скорректировать макрос
Есть 2 столбца, в строке обязательно должны быть заполнены  ячейки этих столбцов

Если не заполнены, цикл должен прерваться и появиться сообщение что не заполнена ячейка в строке

Если ячейки в строке заполнены цикл должен продолжиться


Бьюсь и не получается ничего.
Помогите пожалуйста
 
Уважаемые знатоки! Помогите, пожалуйста!

Есть два столбца A и B ("Изделия" и "Кол-во") в таблице
необходимо проверить строки в таблице (кол-во строк плавающее)
Строго: в строке должно быть заполнены оба значения "Изделие" и "Кол-во"

если хоть одно значение в строке не заполнено, то макрос продолжаться не должен
и должно появиться сообщение о незаполнение ячейки

Если обе ячейки заполнены, то макрос должен продолжить работу

я понимаю, что необходимо пробежаться циклом
нижеуказанный цикл пишет сообщение, что "Некорректно указана информация!"
и продолжает макрос


Private Sub CommandButton1_Click()
Dim x As Long

For x = Cells(Rows.Count, 1).End(xlUp).Row To 6 Step -1

   If IsEmpty(Cells(x, 1)) = False And _
   IsEmpty(Cells(x, 2)) = True _
   Then MsgBox "Некорректно указана информация!"
   Exit Sub
   Exit For
   
   Next x
'----------------------------------------------
'далее продолжение кода


End Sub
 
?
Код
Private Sub CommandButton1_Click()
Dim x As Long

For x = Cells(Rows.Count, 1).End(xlUp).Row To 6 Step -1
  If IsEmpty(Cells(x, 1)) Or IsEmpty(Cells(x, 2)) Then
    MsgBox "Некорректно указана информация!"
    Exit Sub
  End If
Next x
'----------------------------------------------
'далее продолжение кода
End Sub
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх