97 votes

VBA - comment conditionnellement sauter une boucle d'itération

J'ai une boucle sur un tableau. Ce que je veux faire, c'est de tester pour une certaine condition dans la boucle et passer à la prochaine itération si la valeur est 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

Je Sais que je peux faire:

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

mais je veux être en mesure d'enregistrer la dernière valeur de i dans la PrevCouponIndex variable.

Des idées?

Merci

174voto

mwolfe02 Points 11452

VBA n'ont pas d' Continue ou de tout autre équivalent mot-clé à sauter immédiatement à la prochaine itération de boucle. Je suggère une utilisation judicieuse de l' Goto comme une solution de contournement, surtout si c'est juste un exemple artificiel et votre code réel est plus complexe:

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

Si c'est vraiment tout votre code, si, @rhooligan est absolument correcte. Il suffit de mettre une Else clause dans votre If déclaration et être fait avec elle.

31voto

BrianV Points 2726

Ne pourriez-vous pas tout simplement faire quelque chose de simple comme cela?

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

13voto

Jon Egerton Points 16192

Continue For n'est pas valide en VBA ou VB6.

À partir de cette page MSDN , il semble avoir été introduit dans VB.Net dans VS 2005./Net 2.

Comme les autres l'ont dit il n'y a pas vraiment d'autre choix que d'utiliser Goto ou Else.

0voto

chris neilsen Points 21247

Vous pourriez juste manipuler l' for compteur de boucle:

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
    If (Schedule(i, 1) < ReferenceDate) Then
        PrevCouponIndex = i
        i = i + 1
    End If
    DF = Application.Run("SomeFunction"....)
    PV = PV + (DF * Coupon / CouponFrequency)
Next

Avertissement: i pourrait > UBound si la dernière itération déclenche l' If...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X