VBA|GoToステートメントでプロシージャ外にジャンプさせる方法

エクセルVBA VBAの基礎・入門



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ではエラー処理がつきものですので、ぜひ参考にしてみてくださね。




VBAの基礎・入門
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~

コメント

タイトルとURLをコピーしました