For文の途中で処理から出たい。【エクセル】【VBA】

Excel

はじめに

VBAでFor文などの繰り返し処理を途中で抜けるには、Exitステートメントを使用します。
今回は、使用例をご紹介します。

Exitステートメント

Exitステートメントは「Exit 〇〇」と記入すると処理を飛ばしてくれます。
For文やDoLoop文の場合は下記となります。

For文 → Exit For
Do Loop文 → Exit Do

コード

For文で使用する場合は下記のようになります。

Public Sub Exitを使わない()

    Dim ary() As Variant
    ary() = Array("あああ", "いいい", "ううう", "えええ", "おおお")

    Dim i As Integer
    For i = 0 To UBound(ary, 1) Step 1 '配列ary()を1個ずつ回す。
        Debug.Print ary(i)
    Next

    '''イミディエイトウィンドウ
    'あああ
    'いいい
    'ううう
    'えええ
    'おおお

End Sub


Public Sub Exitを使う()

    Dim ary() As Variant
    ary() = Array("あああ", "いいい", "ううう", "えええ", "おおお")

    Dim i As Integer
    For i = 0 To UBound(ary, 1) Step 1 '配列ary()を1個ずつ回す。
        If i = 2 Then
            Exit For
        End If
        Debug.Print ary(i)
    Next

    '''イミディエイトウィンドウ
    'あああ
    'いいい

End Sub

Exitステートメントを使用している方は、i=2で繰り返し処理を抜けているため、
「あああ」「いいい」のみとなっています。

2重以上のFor文から抜けたい場合

For文の中にFor文がある場合は、「Exit For」を使用しても良いですが、
「Exit For」はFor文1個に対して行う必要がある為、記述が大変です。
私は「GoTo文」をお勧めします。

Public Sub For文が2重ある場合_ExitFor()

    Dim ary() As Variant
    ReDim ary(2, 2) As Variant
    
    ary(0, 0) = "ゼロ:ゼロ"
    ary(0, 1) = "ゼロ:イチ"
    ary(0, 2) = "ゼロ:二ー"
    ary(1, 0) = "イチ:ゼロ"
    ary(1, 1) = "イチ:イチ"
    ary(1, 2) = "イチ:二ー"
    ary(2, 0) = "二ー:ゼロ"
    ary(2, 1) = "二ー:イチ"
    ary(2, 2) = "二ー:二ー"

    Dim i As Integer
    Dim j As Integer
    For i = 0 To UBound(ary, 1) Step 1 '配列ary()を1個ずつ回す。
        For j = 0 To UBound(ary, 2) Step 1
            If (i = 1 And j = 1) Then
                Exit For
            End If
            Debug.Print ary(i, j)
        Next
        'Exit Forは1回分しか抜けないため、もう一度必要。
        If (i = 1 And j = 1) Then
            Exit For
        End If
    Next

    '''イミディエイトウィンドウ
    'ゼロ: ゼロ
    'ゼロ: イチ
    'ゼロ: 二ー
    'イチ: ゼロ

End Sub


Public Sub For文が2重ある場合_GoTo文()

    Dim ary() As Variant
    ReDim ary(2, 2) As Variant
    
    ary(0, 0) = "ゼロ:ゼロ"
    ary(0, 1) = "ゼロ:イチ"
    ary(0, 2) = "ゼロ:二ー"
    ary(1, 0) = "イチ:ゼロ"
    ary(1, 1) = "イチ:イチ"
    ary(1, 2) = "イチ:二ー"
    ary(2, 0) = "二ー:ゼロ"
    ary(2, 1) = "二ー:イチ"
    ary(2, 2) = "二ー:二ー"

    Dim i As Integer
    Dim j As Integer
    For i = 0 To UBound(ary, 1) Step 1 '配列ary()を1個ずつ回す。
        For j = 0 To UBound(ary, 2) Step 1
            If (i = 1 And j = 1) Then
                GoTo BREAK
            End If
            Debug.Print ary(i, j)
        Next
    Next
BREAK:
    
    '''イミディエイトウィンドウ
    'ゼロ: ゼロ
    'ゼロ: イチ
    'ゼロ: 二ー
    'イチ: ゼロ

End Sub

おまけ

繰返し処理に用いるExit Forですが、処理自体から抜けたい場合も使用できます。

Public Sub ExitSubを使う()

    Debug.Print "処理を開始します。"
    Call SubMethod
    Debug.Print "処理を終了します。"

    '''イミディエイトウィンドウ
    '処理を開始します。
    '処理中1
    '処理中2
    '処理中3
    '処理を終了します。

End Sub

Private Sub SubMethod()

    Debug.Print "処理中1"
    Debug.Print "処理中2"
    Debug.Print "処理中3"
    Exit Sub
    Debug.Print "処理中4"
    Debug.Print "処理中5"

End Sub

まとめ

  • For文などの繰り返し処理を抜けたい場合は「Exit For」を使用する。
  • For文が2重などで処理している場合は、「GoTo文」を使うと良い。
  • おまけ 「Exit For」以外にも「Exit Sub」のような使い方もできる。

コメント

タイトルとURLをコピーしました