更新日:、 作成日:

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 を使わずに、その処理を関数にします。

複数条件を入力するには「If 文」をご覧ください。

ループをスキップする (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
詳しくは「エラー処理をする」をご覧ください。