質問
私は次のループを持っています。ループ内では、いくつかの異なる基準をテストし、いずれかのテストに失敗した場合、その時点でループ内の残りのコードをスキップして「次へ」項目に進みます。現在これを扱う方法は、「次へ」の直前に行に連れて行く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
.