エラー内容
VBA実行時に、実行時エラー3「Return に対応する GoSub がありません」と表示される。
原因と解決方法
2つの原因と、その解決方法が考えられます。
原因1. Returnから戻るGoSubがない
解説
Returnステートメント実行後は、GoSubステートメントがある場所に処理が戻ります。
なので、Returnに対応するGoSubステートメントがないと、Return実行後にどこに戻ればいいかわからないでこのエラーが発生します。
プログラム修正でGoSubステートメントを間違って削除したり、
他言語の癖でfunctionの最後にReturnを記述した時にやってしまうミスです。
1 2 3 4 5 6 7 8 9 10 11 |
Sub errRuntime3_1() Dim i As Integer i = 0 MsgBox i i = 1 Return End Sub |
解決方法
GoSubステートメントを追加し、GoSubからReturnのある処理を行ラベルで呼び出すように修正します。
また、行ラベルの直前には、Exit SubかExit Functionも必要です。
(理由は、原因2の解説を参考にしてください。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub errRuntime3_1() Dim i As Integer i = 0 GoSub Proc1 ' Proc1を実行 MsgBox i Exit Sub Proc1: i = 1 Return End Sub |
原因2. 行ラベルの前にExit Sub、Exit Functionがない
解説
Returnに対応するGoSubがあっても、Returnの処理が書かれている行ラベルの直前にExit Sub、またはExit Functionがないのが原因です。
Exit Sub、またはExit Functionがないと、すべての処理が終わった後に行ラベル内の処理も実行されてしまいます。
その結果、どこからも呼ばれずにReturnステートメントが実行されてしまい、どこに戻っていいかわからずにこのエラーが発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub errRuntime3_2() Dim i As Integer i = 0 GoSub Proc1 ' Proc1を実行 MsgBox i Proc1: i = 1 Return End Sub |
解決方法
行ラベルの直前にExit Sub、またはExit Functionを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub errRuntime3_2() Dim i As Integer i = 0 GoSub Proc1 ' Proc1を実行 MsgBox i Exit Sub Proc1: i = 1 Return End Sub |
まとめ
そもそもGoSubやGotoは、一般的に使うことがNGとされてます。
処理があっちこっちに飛んで、プログラムの可読性が落ちるからです。(あえて使ってもOKとされるのは、エラートラップのプログラム部分のみです。)
なので、できるだけGoSub、Gotoは使わないようにしましょう。
そもそもGoSubやGotoを使わなくても、サブルーチン化すれば大抵のプログラムは実装できます。
なので、サブルーチン化した可読性の高いコーディングにがんばって取り組んでください。