更新日:、 作成日:
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