VBA - как условно пропустить итерацию цикла - PullRequest
96 голосов
/ 30 декабря 2011

У меня есть цикл по массиву. Я хочу протестировать определенное условие в цикле и перейти к следующей итерации, если true:

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
    If (Schedule(i, 1) < ReferenceDate) Then
        PrevCouponIndex = i
        Continue   '*** THIS LINE DOESN'T COMPILE, nor does "Next"
    End If
    DF = Application.Run("SomeFunction"....)
    PV = PV + (DF * Coupon / CouponFrequency)
Next

Я знаю, что могу сделать:

 If (Schedule(i, 1) < ReferenceDate) Then Continue For

но я хочу иметь возможность записать последнее значение i в переменной PrevCouponIndex.

Есть идеи?

Спасибо

Ответы [ 6 ]

167 голосов
/ 30 декабря 2011

VBA не имеет Continue или любого другого эквивалентного ключевого слова для немедленного перехода к следующей итерации цикла. Я бы предложил разумное использование Goto в качестве обходного пути, особенно если это просто надуманный пример, а ваш реальный код более сложный:

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
    If (Schedule(i, 1) < ReferenceDate) Then
        PrevCouponIndex = i
        Goto NextIteration
    End If
    DF = Application.Run("SomeFunction"....)
    PV = PV + (DF * Coupon / CouponFrequency)
    '....'
    'a whole bunch of other code you are not showing us'
    '....'
    NextIteration:
Next

Если это действительно весь ваш код, то @Brian абсолютно прав. Просто вставьте предложение Else в ваше заявление If и покончите с этим.

30 голосов
/ 30 декабря 2011

Не могли бы вы просто сделать что-то простое, как это?

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
  If (Schedule(i, 1) < ReferenceDate) Then
     PrevCouponIndex = i
  Else
     DF = Application.Run("SomeFunction"....)
     PV = PV + (DF * Coupon / CouponFrequency)
  End If
Next
23 голосов
/ 26 февраля 2018

Вы можете использовать тип continue, используя вложенный Do ... Loop While False:

'This sample will output 1 and 3 only

Dim i As Integer

For i = 1 To 3: Do

    If i = 2 Then Exit Do 'Exit Do is the Continue

    Debug.Print i

Loop While False: Next i
13 голосов
/ 30 декабря 2011

Continue For недопустимо в VBA или VB6.

С этой страницы MSDN похоже, что она была введена в VB.Net в VS 2005./Net 2.

Как говорили другие, на самом деле нет другого выбора, кроме как использовать Goto или Else.

1 голос
/ 05 мая 2016

Привет, я тоже столкнулся с этой проблемой и решаю ее, используя приведенный ниже пример кода

For j = 1 To MyTemplte.Sheets.Count

       If MyTemplte.Sheets(j).Visible = 0 Then
           GoTo DoNothing        
       End If 


'process for this for loop
DoNothing:

Next j 
0 голосов
/ 30 января 2017

Может быть, попытаться положить все это в конце if и использовать else, чтобы пропустить код, это сделает так, что вы не сможете использовать GoTo.

                        If 6 - ((Int_height(Int_Column - 1) - 1) + Int_direction(e, 1)) = 7 Or (Int_Column - 1) + Int_direction(e, 0) = -1 Or (Int_Column - 1) + Int_direction(e, 0) = 7 Then
                Else
                    If Grid((Int_Column - 1) + Int_direction(e, 0), 6 - ((Int_height(Int_Column - 1) - 1) + Int_direction(e, 1))) = "_" Then
                        Console.ReadLine()
                    End If
                End If
...