web-dev-qa-db-ja.com

ループvbaの次の反復にスキップ

条件が真の場合、次の反復に進む単純な条件付きループを作成しようとしています。私がこれまでに持っているコードは次のとおりです。

For i = 2 To 24
    Level = Cells(i, 4)
    Return = Cells(i, 5)

    If Return = 0 And Level = 0 Then
        'Go to the next iteration
    Else
    End If
Next

GoTo NextIterationを試しましたが、「ラベルが定義されていません」というエラーが表示されます。これはおそらく非常に簡単な解決策を持っていますが、支援をいただければ幸いです。ありがとう。

24
Käse
For i = 2 To 24
  Level = Cells(i, 4)
  Return = Cells(i, 5)

  If Return = 0 And Level = 0 Then GoTo NextIteration
  'Go to the next iteration
  Else
  End If
  ' This is how you make a line label in VBA - Do not use keyword or
  ' integer and end it in colon
  NextIteration:
Next
29
B H

基準が満たされたら何もしないでください。そうでない場合は、必要な処理を実行すると、Forループは次の項目に進みます。

For i = 2 To 24
    Level = Cells(i, 4)
    Return = Cells(i, 5)

    If Return = 0 And Level = 0 Then
        'Do nothing
    Else
        'Do something
    End If
Next i

または、条件が満たされた場合にのみ処理するように句を変更します。

For i = 2 To 24
    Level = Cells(i, 4)
    Return = Cells(i, 5)

    If Return <> 0 Or Level <> 0 Then
        'Do something
    End If
Next i
9
Tanner

後藤を使用します

  For x= 1 to 20

       If something then goto continue

       skip this code

  Continue:

  Next x
3
Sam

現在のソリューションは、OPと同じフローを生成します。ラベルは使用しませんが、これはOPの要件ではありませんでした。 「条件がtrueの場合、次の反復に進む単純な条件付きループ」のみを要求しました。これは読みやすいため、Labelを使用するよりも良いオプションです

forループ内に必要なものは、パターンに従います

If (your condition) Then
    'Do something
End If

この場合、条件はNot(Return = 0 And Level = 0)なので、使用します

For i = 2 To 24
    Level = Cells(i, 4)
    Return = Cells(i, 5)

    If (Not(Return = 0 And Level = 0)) Then
        'Do something
    End If
Next i

PS:条件は(Return <> 0 Or Level <> 0)と同等です

1
sancho.s

ループ内の任意のポイントから次の反復に移動するために見つけた最も簡単な方法(PascalのContinue演算子のアナログ)は、追加の単一パスループと演算子Exit Forを使用することです。

'Main loop
For i = 2 To 24
    'Additional single pass loop
    For t = 1 To 1
        Level = Cells(i, 4)
        Return = Cells(i, 5)

        If Return = 0 And Level = 0 Then
            'Go to the next iteration
            Exit For 
        Else
        End If
    Next
Next
0
Sergey Abramov