[ VBA ] Return に対応する GoSub がありません

Pocket

世間的には VBA に限らず Goto 文の使用は推奨されていません。しかし、現在はどうか分かりませんが、10年以上前の Linux カーネルでは Goto 文が、いい塩梅で使用されていた記憶があります。

無下に Goto 文の使用を否定することもないでしょう

昔話はここまでにして、VBA では Goto 文に近い感覚で GoSub ~ Return ステートメントを使って制御することもできます。

スポンサーリンク

GoSub ~ Return ステートメント

GoSub ~ Return ステートメントを使用して、関数内に関数を作るようなイメージになります。例えが良くないような気もします。。。。

    GoSub Proc1 ' 処理1を実行
    
    GoSub Proc2 ' 処理2を実行
    
    Debug.Print ("Exit Sub")
    
    Exit Sub ' プロシージャ終了(これが重要)
    
Proc1:

   Debug.Print ("Proc1")
    
Return

Proc2:

   Debug.Print ("Proc2")

Return

' 実行結果
'-----------------------
' Proc1
' Proc2
' Exit Sub

実行時エラー ‘3’ : Return に対応する GoSub がありません

上記サンプルのコメント内で、Exit Sub が重要だと記載しましたが、この Exit Sub をコメントアウトして実行すると、以下のエラーダイアログが出力されます。

Return に対応する GoSub がありません。

Return に対応する GoSub がありません。

これは、Return で復帰する場合は、必ず GoSub から呼び出されている必要があるということです。Exit Sub をコメントアウトした場合、Proc1 の処理に入っても Return で復帰する場所が特定できません。

なお、実行時エラーなので上記のサンプルの場合、以下のように 2回目の Proc1 が処理された後、エラーダイアログが出力されてしまいます。VBA の困った挙動です。

' 実行結果
'-----------------------
' Proc1
' Proc2
' Proc1

いずれにしましても Goto 文と同様に、GoSub ~ Return 構文は使わないで済むのであれば、使わない方が良いでしょう。

矛盾するようですが、使いたい人は使いましょう。「○○すべき」みたいな偉そうなことは言えません。腰の低いおっさんです。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *