VBAで「行ラベルが定義されていません」というエラーが出るのは、GoTo文で指定したラベルが見つからない(未定義・スペルミス)か、ラベルが別のプロシージャ内にある(スコープ外)ことが原因です。
この記事では、GoTo文の基本的な使い方から、このエラーの具体的な原因と直し方、ループをスキップする方法まで、サンプルコード付きで網羅的に解説します。
GoTo文の基本
GoTo文とは?
GoTo文は、プログラムの処理を特定のラベルに飛ばすVBAの命令です。この命令を使うことで、コードの特定の部分を実行した後に、別の場所へ処理を移動することができます。
GoTo文の書き方とラベルの定義
GoTo文の基本的な書き方は非常にシンプルです。以下のように、GoToに続けてラベル名を記述します。
GoTo ラベル名
このGoTo文が実行されると、指定したラベル名の位置に処理が飛びます。ラベルは次のように定義します。
ラベル名:
サンプルコード1:基本的な使い方

以下は、GoTo文を使用した非常に基本的なサンプルコードです。
Sub SimpleGoToExample()
GoTo Destination
Debug.Print "This line will not be executed."
Destination:
Debug.Print "Arrived at Destination."
End Sub
このコードを実行すると、”Arrived at Destination.”という文字列が出力されます。”This line will not be executed.”という部分は、GoTo文によってスキップされるため、出力されません。
注意点として覚えておくべきこと
- ラベルを定義し忘れると、「エラー 行ラベルが定義されていません」というエラーメッセージが表示されます。
GoTo文は、同じサブプロシージャまたは関数内でのみ有効です。別のサブプロシージャや関数には飛べません。
| 設定項目 | 説明 |
|---|---|
| ラベル名 | 移動先となるラベルを指定します。 |
| GoTo文 | ラベルに移動するための命令です。 |
「行ラベルが定義されていません」エラーの原因と直し方
Microsoft公式ドキュメントによると、このエラーはGoTo文で指定したラベルが「参照のスコープ内にない」場合に発生します。具体的には主に3つの原因が考えられます。
原因1:ラベル名のスペルミス・入力漏れ
GoTo文で指定したラベル名と、実際に定義したラベル名が一文字でも違うと、別のラベルとして扱われエラーになります。
Sub Example1()
GoTo Destination
' NG例:ラベル名のスペルが違う(Destinationではなく Destination1 になっている)
Destination1:
Debug.Print "Arrived"
End Sub
原因2:ラベルの末尾の「:」(コロン)を書き忘れている
ラベルは行の末尾に必ず「:」を付けて定義する必要があります。コロンを忘れると、その行はラベルとして認識されず「定義されていない」扱いになります。
Sub Example2()
GoTo Destination
Destination ' NG例:末尾の「:」が無い
Debug.Print "Arrived"
End Sub
原因3:ラベルが別のプロシージャ(Sub/Function)内にある
GoTo文でジャンプできるのは、同じプロシージャ内で定義されたラベルのみです。別のSubやFunctionで定義したラベルを指定するとこのエラーになります。
Sub ProcA()
GoTo Destination ' NG:Destinationラベルは別プロシージャ(ProcB)にあるため定義されていない扱いになる
End Sub
Sub ProcB()
Destination:
Debug.Print "Arrived"
End Sub
この場合、GoTo文とラベルを同じプロシージャ内にまとめる必要があります。別のプロシージャの処理を呼び出したい場合は、GoTo文ではなくCall文やプロシージャ呼び出しを使いましょう。
ループをスキップする(Continue)
ループスキップの必要性
プログラムには繰り返し処理がよく登場しますが、その中で特定の条件に一致した場合に、その回のループだけをスキップしたいという状況があります。例えば、1から10までの数字を出力するプログラムで、偶数だけをスキップしたい場合などです。
サンプルコード2:ループをスキップする

以下のサンプルコードでは、Forループを使用して1から5までの数字を出力していますが、偶数の場合はスキップしています。
Dim counter As Integer
For counter = 1 To 5
If counter Mod 2 = 0 Then
GoTo SkipLoop
End If
Debug.Print counter
SkipLoop:
Next counter
このコードを実行すると、”1″, “3”, “5”という数字が出力されます。偶数(”2″と”4″)はGoTo文によってスキップされています。
エラー処理とGoTo文
エラー処理の重要性
プログラムがエラーを起こす可能性は常にあります。そのような状況で適切なエラー処理ができなければ、プログラムは予期せぬ動作をするか、最悪の場合、クラッシュしてしまいます。
サンプルコード3:エラー処理の例

以下のサンプルコードでは、On Error GoTo文を使用してエラー処理を行っています。
Sub ErrorHandlingExample()
On Error GoTo ErrorHandler
Dim x As Integer
x = "This is an error."
Exit Sub
ErrorHandler:
Debug.Print "An error has occurred."
End Sub
このコードを実行すると、”An error has occurred.”というエラーメッセージが出力されます。これは、GoTo文がエラーハンドリングにも使用できることを示しています。
FAQ
Q:GoTo文とは何ですか?
A:GoTo文は、Excel VBA(Visual Basic for Applications)などのプログラミング言語で使用される制御文の一つです。この文を使用すると、プログラムの処理を指定したラベルに飛ばすことができます。これにより、特定の処理をスキップしたり、エラーハンドリングを行ったりすることが可能です。
Q:GoTo文はどのように書きますか?
A:GoTo文は非常にシンプルな構文で書かれます。基本的な形式はGoTo ラベル名です。ここで「ラベル名」は、プログラム内で一意に定義された名前で、そのラベルが指す場所に処理が飛びます。
Q:GoTo文の使用は推奨されていますか?
A:GoTo文の使用は一般的には推奨されていません。これは、GoTo文を使いすぎるとプログラムが読みにくく、保守が困難になる可能性があるからです。ただし、特定のケース(例えば、エラーハンドリング)での使用は許容されています。
Q:GoTo文でエラーハンドリングは可能ですか?
A:はい、GoTo文はエラーハンドリングにも使用されます。On Error GoTo ラベル名という形で書くことで、エラーが発生した場合に指定したラベルに処理を飛ばすことができます。
Q:GoTo文はループ内で使えますか?
A:はい、GoTo文はループ内で使うことができます。特定の条件下でループをスキップしたい場合などに使用されます。ただし、このような用途でのGoTo文の使用は、他の制御文で代替可能な場合が多いです。
Q:GoTo文の代わりに何が使えますか?
A:GoTo文の代わりには、If文、For文、While文、Select Case文などの制御文があります。これらの制御文を使うことで、より構造化されたプログラムを書くことができます。
Q:GoTo文で飛べる範囲はどれくらいですか?
A:GoTo文で飛べる範囲は、同じサブプロシージャまたは関数内です。つまり、一つのサブプロシージャから別のサブプロシージャに飛ぶことはできません。
Q:GoTo文で複数のラベルに飛ぶことはできますか?
A:はい、一つのサブプロシージャまたは関数内であれば、複数のラベルに飛ぶことができます。ただし、それによってプログラムが複雑になる可能性があるため、注意が必要です。
Q:GoTo文を使ったプログラムはデバッグが難しいと言われますが、その理由は?
A:GoTo文を使うと、プログラムの流れが非線形になる可能性があります。その結果、どの処理がどの順番で実行されるのかが一見してわかりにくくなり、デバッグが難しくなることが多いです。
関連動画
まとめ
GoTo文は、プログラムの流れを自由にコントロールするための強力なツールです。しかし、その力を持つがゆえに、使い方を誤るとコードが非常に複雑になり、後で読み返したときに理解が難しくなる可能性があります。そのため、GoTo文は必要な場合、またはその機能が必要不可欠な場合にのみ使用するように心掛けましょう。この記事で解説した各ポイントとサンプルコードを参考に、GoTo文を効果的に活用してください。
Excelのショートカットキーの練習
当サイトはショートカットキーの練習を実際の動きを確認しながら練習できる機能がついています。繰り返し指を動かして練習ができるので、ゲーム感覚で遊んでいくうちに自然とショートカットキーが使えるようになれます。ショートカットキーは暗記するよりも実際に手を動かして練習していったほうが習得が早くなるので、是非当サイトをブックマークに登録し定期的に練習してみてください。下記のSTARTキーを押下すると練習を始められます。
※推奨ブラウザ Google Chrome
