Excel VBA の実行時エラー辞典
実行時エラー '1004':アプリケーション定義またはオブジェクト定義のエラーです
Excel の操作が失敗した番号です。表示された全文と停止行から、セル選択・範囲指定・保護・シートコピーなどを切り分けます。
よくある原因
- セル選択(Range.Select):アクティブでないシート上のセルを Select しようとしています。
- 範囲指定(Range・Cells):異なるシートのセルで範囲を作ろうとしている、または行・列番号がシートの範囲を超えています。
- 保護されたシートの編集:保護設定で許可されていないセル変更などを行っています。
- シートコピー(Worksheet.Copy):別々に起動した Excel.Application の間でシートをコピーしています。
直し方
- エラー番号に加え、メッセージ全文と止まった命令を記録します。
- Select なら対象シートがアクティブか確認します。値の読み書きだけなら Select を使わず、対象のブック・シート・セルを明示して操作します。
- Range・Cells なら参照先のシートをそろえ、行・列番号を確認します。保護が原因なら、編集できる範囲を管理者に確認します。
- Worksheet.Copy ならコピー元と先が同じ Excel.Application にあるか確認し、コピー先ブックを同じ Application で作ります。
- 一つのシートや少数のセルで動作を確認し、その後に全体の処理へ戻します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
新しい未保存ブックへコピーする例です。修正前は別の Excel を起動するため、試した後はその Excel を手動で閉じてください。コピー元には少なくとも一つのワークシートが必要です。
修正前
Dim otherExcel As Object, destination As Object
Set otherExcel = CreateObject("Excel.Application")
otherExcel.Visible = True
Set destination = otherExcel.Workbooks.Add
ThisWorkbook.Worksheets(1).Copy Before:=destination.Worksheets(1)
修正後
Dim destination As Workbook
Set destination = Application.Workbooks.Add
ThisWorkbook.Worksheets(1).Copy Before:=destination.Worksheets(1)
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- コピー先を作った直後で止め、Application が同じか確認します。別の命令で止まる場合は、このコピーの修正をそのまま当てはめないでください。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? destination.Application Is ThisWorkbook.Application
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '5':プロシージャ呼び出しが正しくありません
- 実行時エラー '9':インデックスが有効範囲にありません
- 実行時エラー '91':オブジェクト変数または With ブロック変数が設定されていません