更新日:、 作成日:
VBA GoTo 文でラベルに飛ばす
はじめに
Excel VBA マクロの GoTo 文で処理をラベルに飛ばす方法を紹介します。
GoTo ラベル名 のようにして、指定したラベルに処理を飛ばします。
ラベル名: のようにして、この行にラベルを付けます。
前の処理に戻るように、上の行にも移動できます。ループをスキップしたり、エラー処理もできます。
GoTo
GoTo ラベル名 のように入力します。指定したラベルの位置に処理を飛ばします。同じ関数内のラベルにのみ移動できます。
ラベル名: のように入力します。この行にラベルを付けます。
Sub 実行()
    GoTo Label1          ' Label1 へ処理を飛ばす
    Debug.Print("GoTo") ' この処理は実行されない
Label1: ' GoTo の次はここから処理が行われる
    Debug.Print("Label") 
End Subラベルを付けるのを忘れると「エラー 行ラベルが定義されていません」が発生します。
関数内に複数のラベルを付けられます。処理を上にも下にも移動できます。
Sub 実行()
    GoTo Label2
Label1:
    Debug.Print("1")
    GoTo Label3
Label2:
    Debug.Print("2")
    GoTo Label1
Label3:
    Debug.Print("3")
Label4:
    Debug.Print("4")
End Sub ' 2 1 3 4、の順に実行されるこのように GoTo 文は処理の流れを変えるため、コードを追うのが大変になります。多用は禁物で、ルールを決めて必要なときのみ使うようにします。
If GoTo
次のように「If 文」から GoTo で処理を飛ばすことはしません。
Sub 関数(i As Integer)
    If i = 1 Then
        GoTo Label1    ' Label1 へ
    ElseIf i = 2 Then
        GoTo Label2    ' Label2 へ
    Else
        GoTo LabelElse ' LabelElse へ
    End If
    
Label1:
    Debug.Print("1")
    Exit Sub
    
Label2:
    Debug.Print("2")
    Exit Sub
    
LabelElse:
    Debug.Print("Else")
    Exit Sub
End Sub「If 文」自体で処理を分岐しているので、その中に処理を入力します。If を抜けたいときは GoTo を使わずに、その処理を関数にします。
スポンサーリンク
ループをスキップする (Continue)
For や Do のループをスキップして、次のループへ移りたいときがあります。他の言語では Continue などでできますが VBA にその機能はありません。そこで GoTo 文を使用して同じことができます。
GoTo Continue のように入力して、ループをスキップできます。
Dim i As Integer
For i = 1 To 5
    If (i Mod 2) = 0 Then ' i が偶数のときはスキップ
        GoTo Continue ' Continue: の行へ処理を飛ばす
    End If
    ' ここにループ処理
    Debug.Print(i) ' 1 3 5
Continue: ' GoTo Continue の後はここから処理が行われる
Nextエラー処理をする
エラーが発生したときに指定したラベルに処理を移動できます。他の言語では Try-Catch です。
On Error GoTo ラベル名 のように入力します。エラーが発生したときに指定したラベルの位置に処理を飛ばします。
Sub 実行()
On Error GoTo Catch ' エラーが発生したら Catch へ移動する
    Dim i As Integer
    i = "a"  ' エラー発生
    Exit Sub
Catch: ' エラーが発生したらここから処理が始まる
    ' エラー処理
End Sub