【Autoit の基礎】ExitLoop のパラメータ(レベル)

目次

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 1ExitLoop 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.
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次