GoToステートメントは所定の位置まで処理をジャンプさせることができます。
GoToステートメントは、On Error GoToでエラー処理をする際によく用いられますね。
さて、今回はGoToステートメントでプロシージャ外にジャンプさせる方法について徹底的に説明していきます。
GoToステートメントでプロシージャ外にジャンプさせる方法
GoToステートメントは基本的に同じプロシージャ内でしかジャンプできない
GoToステートメントのヘルプを参照すると、
”GoTo ステートメントの分岐先は、同じプロシージャ内だけです。他のプロシージャには分岐できません。”
とあります。
つまり、GoToステートメントは基本的に同じプロシージャ内でしかジャンプすることができません。
それでは、GoToステートメントを使ってプロシージャ外へジャンプする方法は無いのでしょうか?
そんなことはありません。工夫すればGoToステートメントを使ってプロシージャ外へジャンプすることができます。
GoToステートメントでプロシージャ外にジャンプさせる考え方
とはいえ、GoToステートメントのジャンプ先に他プロシージャを指定してもコンパイルエラーになります。
例えば、以下のようなエラー処理をしたいとします。
Sub コード1()
On Error GoTo MyError:
'~~処理1~~
End Sub
Sub コード2()
'~~処理2~~
MyError: '←ここにジャンプしたい
'~~処理3~~
End Sub
「コード1」の処理1においてエラーが発生した場合のエラー処理として On Error GoTo MyError: を指定し、プロシージャ外の「コード2」にジャンプ先を指定し、処理3を実行させていとします。
ですが、当然、以下のようなコンパイルエラーが表示されてしまいます。
それではどのようにジャンプさせるのが良いのでしょうか?
考え方としては、以下のようになります。
- GoToステートメントでプロシージャ外に直接ジャンプすることはできない。
- 逆に、プロシージャ内に「他のプロシージャ」の処理を呼び出す。
-
考えるより先にコードを見てみましょう。
Sub コード1()
On Error GoTo MyError:
'~~処理1~~
Exit Sub '←処理1がエラー無しなら、処理を終了する
MyError: '←処理1でエラーが発生してらここにジャンプする
Call コード3 '←処理3が記述してあるコード3を呼び出す
End Sub
Sub コード2()
'~~処理2~~
End Sub
Sub コード3()
'~~処理3~~
End Sub
コード1の処理1においてエラーが発生したら、コード1内のMyError:にジャンプします。(処理1でエラーが発生しなければ、Exit Subで処理終了となります。)
ジャンプ先で、Call コード3 でコード3を呼び出し、処理3を実行します。
つまり、GoToステートメントで他のプロシージャにジャンプするのではなく、同じプロシージャ内のジャンプした先で他のプロシージャを呼び出すということになります。
【まとめ】GoToステートメントでプロシージャ外にジャンプさせる方法
GoToステートメントは、プロシージャ外に直接ジャンプすることはできません。
したがって、プロシージャ外にジャンプするのではなく、プロシージャ内に「他のプロシージャ」の処理を呼び出す、という方法をとります。
VBAではエラー処理がつきものですので、ぜひ参考にしてみてくださね。
コメント