web-dev-qa-db-ja.com

VBA - forループの繰り返しを条件付きでスキップする方法

私は配列の上に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変数にiの最後の値を記録できるようにしたいです。

何か案は?

ありがとう

95
Richard H

このような単純なことをしてみませんか。

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
30
Brian

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文に入れて、それを実行するだけです。

167
mwolfe02

ネストされたDo ... Loop While Falseを使うことで一種のcontinueを使うことができます。

'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
22

Continue ForはVBAまたはVB6では無効です。

このMSDNページからVS 2005./Net 2でVB.Netに紹介されたようです。

他の人が言っているように、GotoまたはElseを使う以外に選択肢は実際にはありません。

13
Jon Egerton

こんにちは私もこの問題に直面していると私は以下の例のコードを使用してこれを解決します

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 
1
Singaravelan