Excel VBA の実行時エラー辞典
実行時エラー '20':エラーが発生していないときに Resume を実行することはできません
エラー処理のラベルの前に Exit Sub を置き忘れ、正常に終わったときも Resume まで進んでいないか確認します。
よくある原因
- エラー処理のラベルの直前に Exit Sub(Function なら Exit Function)がなく、正常に終わった処理がそのまま Resume まで進んでいます。
- On Error GoTo の飛び先ではない GoTo で、エラー処理の部分へ移動しています。
- ラベル名の書き間違いで、意図しないエラー処理の部分へ移動しています。
- Resume をエラー処理の部分の外に書いています。
直し方
- 停止した Resume を含むラベルと、そこへ入る経路(上からの通常の流れ・GoTo)を確認します。
- エラー処理のラベルの直前に Exit Sub または Exit Function を置き、正常時はそこで終えるようにします。
- GoTo の移動先とラベル名を照合し、エラー処理のラベルへは On Error GoTo からだけ入るようにします。
- エラー処理の外に書いた Resume は、エラー処理の中へ移すか削除します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
最初のシートの A1 を読む処理にエラー処理を付けた例です。修正前は、正常に読めた場合もメッセージが表示され、その後の Resume で止まります。
修正前
Sub ReadFirstCell()
On Error GoTo Failed
Debug.Print ThisWorkbook.Worksheets(1).Range("A1").Value2
Failed:
MsgBox "読み込めませんでした"
Resume Next
End Sub
修正後
Sub ReadFirstCell()
On Error GoTo Failed
Debug.Print ThisWorkbook.Worksheets(1).Range("A1").Value2
Exit Sub
Failed:
MsgBox "読み込めませんでした:" & Err.Description
End Sub
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- エラー処理のラベルの次の行にブレークポイントを置き、エラーが起きていないのにそこで止まるか確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? Err.Number, Err.Description
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '3':Return に対応する GoSub がありません
- 実行時エラー '35':Sub、Function、または Property が定義されていません
- 実行時エラー '92':For ループが初期化されていません