VBA - как условно пропустить итерацию цикла

65

У меня есть цикл for над массивом. То, что я хочу сделать, - это тест для определенного условия в цикле и переход к следующей итерации, если 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

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

Любые идеи?

Спасибо

  • 1
    Вы сказали: «Я знаю, что могу сделать: If (Schedule(i, 1) < ReferenceDate) Then Continue For » Вы уверены в этом? Continue не является ключевым словом VBA.
  • 0
    @ mwolfe02 - нет, не уверен, но где-то видел в примерах (cpearson?)
Показать ещё 1 комментарий
Теги:
loops
conditional

5 ответов

26
Лучший ответ

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

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
  • 3
    На самом деле, это именно то, что я сделал :) Но, тем не менее, меня это беспокоит, я должен обернуть вещи в Else. Спасибо
  • 4
    +1 @RichardH ну вы должны использовать IF для теста, так что это не так уж дорого в коде. Однако следует убедиться, что наиболее распространенным результатом является то, что Schedule(i, 1) меньше, чем ReferenceDate чтобы избежать выполнения Else чаще, чем необходимо. В противном случае используйте (ReferenceDate>=Schedule(i, 1)) . (если тест 50/50, то нет необходимости в оптимизации)
Показать ещё 1 комментарий
128

У 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 и сделайте с ним.

  • 16
    Спасибо, это хороший совет по поводу GoTo (VBA - возвращение в 1964)
  • 2
    GoTo это зло! Не используйте GoTo или ваш код попадет в ад! Если серьезно, пожалуйста, не используйте GoTo в вашем коде.
Показать ещё 9 комментариев
10

Continue For недействителен в VBA или VB6.

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

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

2

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

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
    Не уверен, почему за него проголосовали, и у следующего ответа более 100 голосов, и они - тот же самый ответ!
  • 2
    Вероятно, потому что этот ответ был написан через 5 лет после этого ответа, и является точно такой же концепцией. Почему это должно получить голоса?
-1

Возможно, попробуйте положить все это в конце, если и использовать другое, чтобы пропустить код, это сделает так, что вы не сможете использовать 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню