Excel VBA の実行時エラー辞典
実行時エラー '3':Return に対応する GoSub がありません
処理を終えるための Return と、GoSub から戻る Return を取り違えていないか確認します。
よくある原因
- ボタンの処理を途中で終えるために Return を書いています。
- GoSub を削除した後に Return だけが残っています。
- ラベルの前で処理を終了せず、そのまま Return の行まで進んでいます。
直し方
- 停止した Return の直前まで、どの順に処理が進んだか調べます。
- Sub を途中で終える目的なら Exit Sub にします。Function の戻り値は関数名に代入し、終了には Exit Function を使います。
- GoSub を使う既存コードなら、通常の処理からラベル内へ流れ込まないように終了位置を確認します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
最初のワークシートの A1 が空のとき、ボタンの処理を終える例です。
修正前
Sub CheckInput()
If Len(ThisWorkbook.Worksheets(1).Range("A1").Text) = 0 Then Return
End Sub
修正後
Sub CheckInput()
If Len(ThisWorkbook.Worksheets(1).Range("A1").Text) = 0 Then Exit Sub
MsgBox "入力があります"
End Sub
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- Return と GoSub を検索し、Return の行にブレークポイントを置いて呼び出し元を確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? ThisWorkbook.Worksheets(1).Range("A1").Text
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '5':プロシージャ呼び出しが正しくありません
- 実行時エラー '28':スタック領域が不足しています
- 実行時エラー '35':Sub、Function、または Property が定義されていません