Переход к следующему элементу из цикла For-Next
Вопрос
У меня есть цикл For-Next.Внутри цикла я тестирую несколько различных критериев, и если какой-либо тест завершается неудачей, то в этот момент я готов пропустить оставшуюся часть кода в цикле и перейти к "следующему" элементу.В настоящее время я справляюсь с этим с помощью инструкции GoTo, которая приводит меня к строке прямо перед "Next".Я бы предпочел не использовать оператор GoTo, есть ли другой способ перейти к "следующему" элементу из цикла For-Next?ТИА!
For x = 1 to 10
Test 1
If Test 1 fails then
GoTo Line1
End if
Test 2
If Test 2 fails then
GoTo Line1
End if
.
.
.
If all tests pass then
add item to array
End if
Line1:
Next
Решение
Вот обходной путь для отсутствия ключевого слова отсутствия генеракодицетагкода:
For x = 1 to 10
Do
Test 1
If Test 1 fails then
Exit Do
End if
Test 2
If Test 2 fails then
Exit Do
End if
.
.
.
If all tests pass then
add item to array
End if
Loop While False
Next
. Другие советы
К сожалению, такого нет continue
-подобное утверждение в for
цикл в vba.(Соответствующая структура управления Exit For
действительно существует, но здесь это ничем не поможет).
И это хорошо, что у вас есть оговорки по поводу использования GoTo
:они действительно затрудняют выполнение кода.
Лучше всего поместить код в цикл в отдельной функции и использовать Exit Function
в рамках этой функции в соответствующих точках.Затем вы даже можете передать коды ошибок обратно вызывающему абоненту, что поможет коду масштабироваться.
Вы можете использовать, если еще лестница:
For x = 1 to 10
if test 1
else if test 2
else if test 3
.
.
.
.
else
add item to array
end if
Next
.
Кроме того, нет никакого прямого способа перейти между вашим кодом, Надеюсь, это может помочь.
Если у вас нет слишком много тестов, вы можете использовать условие Not
и создать вложенное оператор If
.Это должно иметь практически тот же эффект, что и что вы просите, поскольку любой неудачный тест закончит это оператор If
и переместить код на следующий X в цикле без выполнения следующих тестов.
Вот пример того, что я имею в виду - двух тестовой цикл, который создает массив, содержащий номера 5-10:
Sub TestConditionalPass()
Dim intX As Integer
Dim intArray() As Integer
ReDim intArray(1)
For intX = 1 To 10
If Not intX -2 < 1 Then
If Not intX * 2 < 10 Then
ReDim Preserve intArray(UBound(intArray) + 1)
intArray(UBound(intArray)) = intX
End If
End If
Next intX
End Sub
. Поскольку вы преобразуете действие только в том случае, если все тесты добиваются успеха, то сделайте IF-оператор с ADD. vba неКороткое замыкание Испытания (т.е. он оценит каждый тестовый случай, даже если первый возвращает false.) Я бы предложил инкапсулировать каждый тест в функции, которая возвращает логию, чтобы сохранить свой код.
If Test1() and _
Test2() and _
testn() THEN
add item to array
End if
.
Другой способ - использовать булевую переменную в вашем коде, как это
Dim Success as Boolean
Success=True
Test 1
If Test 1 fails then
Success=false
End if
Test 2
If Test 2 fails then
Success=false
End if
.
.
.
If Success then
add item to array
End if
.
Если тесты дорогие, вы можете добавить внутреннюю, если проверку оператора, чтобы увидеть, если нам нужно оценить следующий тест, такой как это
If Success Then
If Test n fails then
Success=false
End If
End if
.