質問

私は次のループを持っています。ループ内では、いくつかの異なる基準をテストし、いずれかのテストに失敗した場合、その時点でループ内の残りのコードをスキップして「次へ」項目に進みます。現在これを扱う方法は、「次へ」の直前に行に連れて行くGOTOステートメントがあります。GOTOステートメントを使用しないことをお勧めします。次のループ内から「次へ」項目に進む方法はありますか?TIA!

For x = 1 to 10
    Test 1
    If Test 1 fails then
        GoTo Line1
    End if

    Test 2
    If Test 2 fails then
        GoTo Line1
    End if
    .
    .
    .
    If all tests pass then
        add item to array
    End if
Line1:    
Next
.

役に立ちましたか?

解決

continueキーワードの欠如に対する回避策:

For x = 1 to 10
    Do
        Test 1
        If Test 1 fails then
            Exit Do
        End if

        Test 2
        If Test 2 fails then
            Exit Do
        End if
        .
        .
        .
        If all tests pass then
            add item to array
        End if
    Loop While False
Next
.

他のヒント

残念ながら、VBAのcontinueループにfor様のステートメントはありません。(関連制御構造のExit Forは存在しますが、それはここでは役に立ちません)。

GoToを使用することに予約があるのは良いことです:彼らは追跡するのが難しいコードを作ります。

あなたの最善の策は、コードを別の機能にループに入れ、その関数内でExit Functionを適切な点で使用することです。その後、エラーコードを発信者に中継することも、コードを拡大縮小するのに役立ちます。

els resemer:

の場合に使用できます
For x = 1 to 10
if test 1 
else if test 2
else if test 3
. 
.
.
.
else
  add item to array
end if
Next
.

後藤以外には、コードの間にジャンプする直接的な方法はありません。 これが役立つかもしれないことを願っています。

テストが多すぎない場合は、Not状態を使用してネストされたIfステートメントを構築することができます。これは、失敗したテストでは、このテストを実行せずにコードをループ内の次のXに移動して、その故障したテストが終了し、コードを次のXに移動してください。

これは、私が意味するものの例です - 5から10の番号を含む配列を構築する2つのテストループ:

Sub TestConditionalPass()

    Dim intX As Integer
    Dim intArray() As Integer
        ReDim intArray(1)

    For intX = 1 To 10
        If Not intX -2 < 1 Then
            If Not intX * 2 < 10 Then
                ReDim Preserve intArray(UBound(intArray) + 1)
                    intArray(UBound(intArray)) = intX
            End If
        End If
    Next intX

End Sub
.

すべてのテストが成功した場合にのみアクションを実行してから、IFステートメントをANDSとします。 VBAではありませんショートサーキットテスト(すなわち、最初のものがFALSEを返す場合でも、各テストケースを評価します。)コードTIDYを保持するためのブール値を返す関数で各テストをカプセル化することをお勧めします。

If Test1()  and _
   Test2()  and _
   testn()  THEN
    add item to array
End if
.

別の方法は、この

のように、コード内のブール変数を利用することです。
Dim Success as Boolean
Success=True
Test 1
If Test 1 fails then
    Success=false
End if

Test 2
If Test 2 fails then
    Success=false
End if
.
.
.
If Success then
    add item to array
End if
.

テストが高価な場合は、この

のように次のテストを評価する必要があるかどうかを確認するために内部IFステートメントを追加できます。
 If Success Then
    If Test n fails then
       Success=false
    End If
End if
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top