2012-03-04 4 views
0

Я пробовал несколько методов, но не смог добиться успеха. Моя проблема - запуск loop1, если выполняется какое-то условие, запустите loop2 до тех пор, пока не будет выполнено какое-либо условие, вернитесь к loop1.Возвращаясь к циклу после использования GoTo

sub program() 
Dim i As Integer 
Dim q As Integer 

For i=1 to 350 
If Range("A"&i).value=1 And Range("D"&i).Value<15 Then Goto 1 
Next i 

1:q=0 
    Do While List1.Range("A"&i+q).Value<>"" 
    Range("E"&i+q)="K" 
    q=q+1 
    Loop 

End Sub 

Я не нашел способ, как вернуть после выполнения «1 петлю» назад к «For Loop» Next и продолжить на следующий я. Может быть, это невозможно, и я должен включить код как-то в первый цикл?! спасибо

+0

Я не знаю VBA, поэтому не могу ответить на весь вопрос, но то, что вы пытаетесь реализовать, - это «машина состояния». Довольно мощная техника. –

ответ

1

Я на самом деле не знаю, VBA (я в последний раз использовал VB примерно 1996), но это должно быть более или менее правильно:

sub program() 
Dim i As Integer 
Dim q As Integer 

i = 1 
Do while i <= 350 
    If Range("A"&i).value=1 And Range("D"&i).Value<15 Then 
    Do While i <= 350 And List1.Range("A"&i).Value<>"" 
     Range("E"&i)="K" 
     i=i+1 
    Loop 
    Else 
     i=i+1 
    End If 
Loop 
end do 
End Sub 
+1

Это работает отлично. Код в VBA не имеет выражения «end do» (Do While завершено только Loop). Спасибо ! –

3

Сделайте код в 1 в функцию и позвоните, чтобы вместо использования goto. Когда функция выйдет, ваш первый цикл продолжит выполнение, с которого он остановился.

+0

Я пробовал это, но по какой-то причине он не работал должным образом, поэтому использовал второй ответ. Но если кто-то в будущем использует этот метод, необходимо объявить переменные глобальными - http://stackoverflow.com/questions/2722146/how-do-declare-a-global-variable-in-vba –

0

Использование GoTo не рекомендуется даже MSDN (вы должны использовать его только для обработки ошибок в паре с Резюме), но так как вы просили, это подход:

Sub program() 
    Dim i As Integer 
    Dim q As Integer 

    For i=1 to 350 
     If ((Range("A"&i).value=1) And (Range("D"&i).Value<15)) Then Goto OtherLoop 
FirstLoop: 
    Next i 

Exit Sub 

OtherLoop: 
    q=0 
    Do While List1.Range("A"&i+q).Value<>"" 
     Range("E"&i+q)="K" 
     q=q+1 
    Loop 
    Goto FirstLoop 

End Sub 

Вам нужно заявление Exit, чтобы сохранить ваш код от входа «OtherLoop», когда он заканчивает «FirstLoop», а также нужно сказать, чтобы он вернулся где вы были раньше. Опять же, избегайте использования этого материала. Петли в петлях (отступдля организации, пожалуйста,), а также дополнительные вызовы процедур (вызов другого суб или функции).

Смежные вопросы