Переход к следующему элементу из цикла For-Next

StackOverflow https://stackoverflow.com//questions/23063002

  •  26-12-2019
  •  | 
  •  

Вопрос

У меня есть цикл 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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top