Excel VBA の実行時エラー辞典

実行時エラー '20':エラーが発生していないときに Resume を実行することはできません

エラー処理のラベルの前に Exit Sub を置き忘れ、正常に終わったときも Resume まで進んでいないか確認します。

よくある原因

直し方

  1. 停止した Resume を含むラベルと、そこへ入る経路(上からの通常の流れ・GoTo)を確認します。
  2. エラー処理のラベルの直前に Exit Sub または Exit Function を置き、正常時はそこで終えるようにします。
  3. GoTo の移動先とラベル名を照合し、エラー処理のラベルへは On Error GoTo からだけ入るようにします。
  4. エラー処理の外に書いた 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

調べ方

  1. エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
  2. 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
  3. エラー処理のラベルの次の行にブレークポイントを置き、エラーが起きていないのにそこで止まるか確認します。
  4. Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? Err.Number, Err.Description

Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。

関連エラー

確認した公式資料