目次
ExitLoop のパラメータ
ExitLoop は While/Do/For ループを終了する際に使用します。
この ExitLoop は、ループ内のどこでエラーが起きているのかを調べるのにとても便利です。
ExitLoop にはパラメータ(レベル)があり、抜けるループの数を指定できます。
デフォルトは 「1」つまり、現在のループを抜けます。
簡単なサンプルを書いてみましたので、参考にしてみてください。
For $s = 0 To 9; 1つ目のループ
For $i = 0 To 9; 2つ目のループ
$file = FileOpen('Autoit3') ;存在しないファイルを指定しています。
If $file = -1 Then
ExitLoop ;現在のループを抜ける。 ExitLoop 1 と同じ。
;~ ExitLoop 2 ;2つのループを抜ける。1つ目のループは実行されません。
Else
MsgBox(0, $s, 'FileOpen でエラーが出なければメッセージボックスを表示します。')
EndIf
Next
Next
MsgBox(0, 0, "$s = " & $s)
出力結果:
$s = 10
$a = 0
While 1
ConsoleWrite('Loop 1' & @CRLF)
While 2
ConsoleWrite('Loop 2' & @CRLF)
While 3
ConsoleWrite('Loop 3' & @CRLF)
While 4
$a += 1
ConsoleWrite('Loop 4' & @CRLF)
If $a = 5 Then
MsgBox(0, 0, 'ExitLoop 0')
ConsoleWrite('===ExitLoop 0===' & @CRLF)
ExitLoop 0 ;効果なし
ElseIf $a = 10 Then
MsgBox(0, 0, 'ExitLoop 1')
ConsoleWrite('===ExitLoop 1===' & @CRLF)
ExitLoop 1 ; While 4 を抜けます。
ElseIf $a = 30 Then
MsgBox(0, 0, 'ExitLoop 2')
ConsoleWrite('===ExitLoop 2===' & @CRLF)
ExitLoop 2 ; While 3、While 4 を抜けます。
ElseIf $a = 50 Then
MsgBox(0, 0, 'ExitLoop 3')
ConsoleWrite('===ExitLoop 3===' & @CRLF)
ExitLoop 3 ; While 2、While 3、While 4 を抜けます。
ElseIf $a = 70 Then
MsgBox(0, 0, 'ExitLoop 4')
ConsoleWrite('===ExitLoop 4===' & @CRLF)
ExitLoop 4 ; すべてのループを抜けます。
EndIf
WEnd
WEnd
WEnd
WEnd
MsgBox(0, 0, 'すべてのループを抜けました。')
出力結果:
Loop 1
Loop 2
Loop 3
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
===ExitLoop 0===
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
===ExitLoop 1===
Loop 3
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
===ExitLoop 2===
Loop 2
Loop 3
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
===ExitLoop 3===
Loop 1
Loop 2
Loop 3
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
Loop 4
===ExitLoop 4===
オプションlevelパラメータは、ExitLoopネストされたループをいくつ抜けるかを決定します。
デフォルトでは、ExitLoop現在実行されている最も内側のループのみを終了します。このlevelパラメータを使用すると、複数のループを一度に終了できます。
ネストされたループをロシアの入れ子人形のセットのように考えてください。
ExitLoop(または):現在乗っている単一の人形ExitLoop 1から飛び出します。ExitLoop 2:現在の人形とそのすぐ外の人形から飛び出します。ExitLoop 3:三つの入れ子人形から飛び出します。
ExitLoop 1とExitLoop 2の動作の比較をしてみましょう。
標準 ExitLoop(レベル1)
このコードは 2行目で文字「B」を検索します。文字が見つかると、内側のループ(ループ)ExitLoopのみが停止します。外側のループ(ループ)は次の行に進みます。
Local $aArray[3][3] = [["A", "A", "A"], ["A", "B", "A"], ["A", "A", "A"]]
For $i = 0 To 2 ; Outer Loop (Rows)
For $j = 0 To 2 ; Inner Loop (Columns)
If $aArray[$i][$j] = "B" Then
ConsoleWrite("Found 'B' at row " & $i & ", column " & $j & @CRLF)
ConsoleWrite("Exiting inner loop only." & @CRLF)
ExitLoop ; Exits only the $j loop
EndIf
Next
ConsoleWrite("Finished row " & $i & @CRLF)
Next
出力:
Finished row 0
Found 'B' at row 1, column 1
Exiting inner loop only.
Finished row 1
Finished row 2
ExitLoop 2
このコードは同じ検索を実行しますが、「B」が見つかるとすぐに内側の ( ) ループと外側の ( ) ループの両方をExitLoop 2停止します。
Local $aArray[3][3] = [["A", "A", "A"], ["A", "B", "A"], ["A", "A", "A"]]
For $i = 0 To 2 ; Outer Loop (Rows)
For $j = 0 To 2 ; Inner Loop (Columns)
If $aArray[$i][$j] = "B" Then
ConsoleWrite("Found 'B' at row " & $i & ", column " & $j & @CRLF)
ConsoleWrite("Exiting BOTH loops." & @CRLF)
ExitLoop 2 ; Exits both the $j and $i loops
EndIf
Next
; This line will not be reached after 'B' is found
ConsoleWrite("Finished row " & $i & @CRLF)
Next
出力:
Finished row 0
Found 'B' at row 1, column 1
Exiting BOTH loops.
コメント