マクロの守り中小企業のAI導入支援|Excelマクロ(VBA)の属人化の解消からExcelマクロ(VBA)の引き継ぎ 専門

コラムよくある困りごと

VBAの実行時エラー1004は何が原因?9・13・91も、8つの原因を起こして番号から逆引きした

引き継いだVBAマクロの実行時エラー1004は、架空の受注集計マクロ(約800行)で起こした8つの原因のうち、空の範囲と保護シートの2つでしか出ませんでした。シート名の変更とシートの削除は、どちらも9です。残りは13・91・76と、番号が出ない1つでした。各原因を3回ずつ、計24回起こして、番号も文面も毎回同じでした。番号から原因を引く表を載せます(2026年10月時点)。

読み解きから直す・置き換えるまでの流れと費用はExcelマクロの引き継ぎのページにまとめています。

要点

  • 1004になったのは、8つの原因のうち空の範囲と保護シートの2つでした。
  • シート名の変更とシートの削除は、どちらもエラー9でした。1004ではありません。
  • 各原因を3回ずつ、計24回起こして、番号と文面は毎回同じでした。
  • 直す前に、原本の複製と、止まった行・番号・文面の記録を残します。
目次
  1. 実行時エラー1004・9・13・91は、それぞれ何が原因ですか?
  2. 1004は、シートや範囲が見つからないときのエラーですか?
  3. 画面の番号から、疑う場所を引くにはどうしますか?
  4. 作った人がいないとき、直す前に何をしますか?
  5. この実験の結果は、ほかのマクロにも当てはまりますか?
  6. このサイトで相談するには?
  7. よくある質問

実行時エラー1004・9・13・91は、それぞれ何が原因ですか?

番号は原因を1つに決めません。8つの原因を起こすと、9が2つ、1004が2つ、13・91・76と番号なしが1つずつでした。原因・番号・確認場所は次の表のとおりです。

実験に使ったのは、受注の明細を得意先と品目ごとに集計し、出荷指示やPDFを作る架空のマクロです。12モジュール788行に、品目の検索と色付けの短い手続きを2つ足し、約800行にしました。引き継ぎでよくある8つの原因を1つずつ起こし、止まった行は、その手続きに行番号を振った写しで読んでいます。

起こした原因 番号 画面の文面 止まった行 確認場所
シート名の変更 9 インデックスが有効範囲にありません。 Set src = Sheets("受注入力") シート名の一覧
シートの削除 9 同上 Set ws = Worksheets("品目集計") シートの有無
空の範囲 1004 該当するセルが見つかりません。 Range("E2:E2000").SpecialCells(…) 範囲の中身
型の違う値 13 型が一致しません。 amt = src.Cells(r, 6).Value * src.Cells(r, 7).Value 止まった行のセルの値
オブジェクト未設定 91 オブジェクト変数または With ブロック変数が設定されていません。 …Value = hit.Row Find で探した値の有無
外部ファイル欠落 76 パスが見つかりません。 Open fn For Output As #fno 保存先・取込先のフォルダ
保護シート 1004 変更しようとしているセルやグラフは保護されているシート上にあります。… .Range("A2:F1000").ClearContents シートの保護
64bitのDeclare なし マクロ ‘…’ を実行できません。… 実行時には止まらない Declare文のPtrSafe

8つの原因すべてを3回ずつ起こして、番号と文面は24回とも同じでした。何も変えないときは、試した5つの手続きがどれもエラーなしで終わっています。

画面に出たエラー番号から疑う場所を引く早見図。9はシート名、13は値の型、91は探した値、76はフォルダ、1004は保護・空の範囲、番号なしはDeclare文画面に出た番号から、疑う場所を引く架空の受注集計マクロ(約800行)で起こした8つの原因から作った早見画面の番号文面と、止まった行の例まず疑う場所9インデックスが有効範囲にありませんSet src = Sheets("受注入力")シート名・ブック名が変わっていないかシートが消えていないか13型が一致しません単価のセルに文字(オープン価格)止まった行の変数をセルの中身と見比べる91オブジェクト変数が設定されていませんFind の結果をそのまま使った行探した値が、相手の表に本当にあるか76パスが見つかりませんOpen fn For Output保存先・取込先のフォルダの有無(設定シートの値)1004文面が何種類もある(下の注)ClearContents、SpecialCells など保護、空の範囲、保存先文面を読んで分ける番号なしマクロを実行できませんDeclare 文のコンパイルエラーPtrSafe のない DeclareVBE の[デバッグ]→[コンパイル]注:1004 は Excel が返す番号で、VBA の公式一覧(Trappable errors)には載っていない。文面で原因を分ける主宰が 2026-10-17 に error_numbers.py で再現(Excel 16.0 build 20430.0、日本語版)
図1 エラー番号から疑う場所を引く早見。主宰が2026年10月17日に、8つの原因を起こして作りました。

1004は、シートや範囲が見つからないときのエラーですか?

いいえ。シートが見つからない原因は9でした。実験でシート名を変えても、シートを消しても、画面に出たのは「インデックスが有効範囲にありません。」の9です。

Microsoftの説明では、9は配列の要素やコレクションのメンバーが存在しないときのエラーです。名前でシートを探すSheetsも、このコレクションの検索にあたります。

1004になったのは、2つです。空の範囲は「該当するセルが見つかりません」、保護シートは「保護されているシート上のセルを変更しようとした」でした。8つのうち2つですから、4分の1にあたります。

8つの外でも試すと、1004はさらに2通りで出ました。PDFの保存先のフォルダがないときは「ドキュメントを保存できませんでした。…」です。

ブックのウィンドウを非表示にして画面を初期化したときは、「‘Sheets’ メソッドは失敗しました: ‘_Global’ オブジェクト」でした。10通りのうち4通りが1004で、文面は4種類に分かれました。

Microsoftの「Trappable errors」の一覧に、9・13・76・91はありますが、1004はありません。1004はExcelが返す番号で、原因は文面で分けます。

8つの原因を起こして出たエラー番号の横棒グラフ。9が2件、1004が2件、13・91・76・番号なしが各1件。各原因は3回とも同じ番号と文面だった8つの原因を起こして出た番号各原因を3回ずつ(新しいExcel・新しいブック)。24回すべて同じ番号と文面でした9 インデックスが有効範囲にありません2件シート名の変更・シートの削除1004 Excel の文面(2種類)2件空の範囲・保護シート13 型が一致しません1件型の違う値91 オブジェクト変数が設定されていません1件オブジェクト未設定76 パスが見つかりません1件外部ファイル欠落番号なし マクロを実行できません1件64bit の Declare同じ番号の原因が2件ある9と1004の見分けは、止まった行と文面でする
図2 8つの原因を起こして出た番号。各原因3回、計24回で、番号は毎回同じでした。

画面の番号から、疑う場所を引くにはどうしますか?

番号が9なら、シートやブックを名前で探している行を疑います。止まった行の名前と、実際のシート名を見比べるのが最初の一手です。列を足したときのように、エラーを出さずに集計がずれる壊れ方は、列を追加するとマクロはずれる?の実験にまとめています。

13は、止まった行の変数に入るセルの値が、文字だったり、エラー値だったりしないかを見ます。実験では単価のセルに「オープン価格」と入れると、掛け算の行で止まりました。

91は、Findなどで探した結果を、見つからない場合を考えずに使っている行です。探している値が、相手の表に本当にあるかを確かめます。76は、設定シートに書いた保存先や取込先のフォルダが、いまもあるかです。

番号が出ず「マクロ ‘…’ を実行できません。」とだけ出るときは、PtrSafeのないDeclare文を疑います。Microsoftの説明では、PtrSafeのないDeclare文は64bit版のVBAでコンパイル時エラーです。実験では、COMから実行したため、画面のコンパイルエラーの表示までは確かめていません。VBEの[デバッグ]→[コンパイル]で、原因の行が分かります。

作った人がいないとき、直す前に何をしますか?

直す前に、原本の複製と、止まった行の記録を残します。この2つがないと、直したあとで何を変えたかも、元に戻せるかも分からなくなります。

  1. 原本のブックを、日付を付けて複製します。拡張子は.xlsmのままにします。.xlsxで保存し直すと、マクロが消えます。
  2. 複製のほうでマクロを動かし、エラーの画面を出します。
  3. 番号、文面、止まった手続きの名前、黄色になった行の文を書き留めます。
  4. エラーの直前に押したボタンと、開いていたシートも書き留めます。

記録が3行たまれば、次に同じ番号が出たとき、表と見比べられます。止まった手続きに、入口のボタンからどう来るかは、呼び出し関係とシートの読み書きの図で追えます。この記録は、Excelマクロの引き継ぎの引き継ぎ書の元にもなります。項目の例はVBAの引き継ぎ書のひな形にあります。

この実験の結果は、ほかのマクロにも当てはまりますか?

当てはまるのは、同じ書き方をしている行です。番号は原因だけでなく、止まった行の書き方でも変わります。

試したのは、1本のマクロの8つの原因です。マクロは架空で、データも架空です。別のマクロなら、同じ原因でも番号が変わりえます。

たとえば、探したコードが見つからないとき、ここでは91でした。見つからない場合を先に調べる書き方なら、エラーにならず空の答えが返ります。

実験は、Excel 16.0(ビルド20430、64bit、日本語版)をCOMから動かしました。ボタンから動かすと、入口のエラー処理が先に受けて、番号を出さずに文面だけの画面になることがあります。止まった行は、同じ手続きに行番号とエラー処理を足した写しをもう一度動かし、Erl(エラーの行番号)で読みました。

再現の手順は、error_numbers.py(図はfig_error_numbers.py)にまとめています。足した2つの手続き(14行)は、同じフォルダのmodExtra.basです。

同じマクロが社内に何本あるかは棚卸しの手順で数えます。直すか置き換えるかの比べ方はExcelマクロの移行先の比較に、金額は導入例(イメージ)にあります。

このサイトで相談するには?

番号の意味は分かっても、どの行から手を付けるか迷うマクロは、一緒に止まった行を見て、直すか置き換えるかを考えます。何をどう頼むか決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。

準備は要りません。無料で相談するからお送りください。返信は最短当日です。

よくある質問

1004と出たら、シートが見つからないのが原因ですか?
いいえ。実験では、シートが見つからない2つの原因はどちらも9で、1004は空の範囲と保護シートの2つでした。1004は文面を読んで分けます。
番号が出ず「マクロを実行できません」とだけ出たら、何を疑いますか?
PtrSafeのないDeclare文です。実験では同じ文面になりました。Microsoftの説明でも、PtrSafeのないDeclare文は64bit版でコンパイル時エラーになります。
止まった行を記録するには、どうすればよいですか?
エラーの画面で[デバッグ]を押すと、止まった行が黄色になります。直さずに、番号・文面・手続きの名前・その行の文を書き留めます。
ボタンから動かしたときも、同じ番号が画面に出ますか?
出るとは限りません。実験のマクロは、ボタンの入口にエラー処理があり、番号なしの文面だけを出す作りです。実験は入口を通さず、中の手続きを直接動かしました。

この記事の実験・計算の条件

架空の受注集計マクロ(約800行)で8つの原因を各3回、計24回。手元のデスクトップ版 Excel 16.0(ビルド20430、64bit、日本語版)をCOMから実行。2026年10月17日。

出典

  1. Microsoft Learn「Trappable errors」(ms.date 2019-08-18、更新 2024-02-01)(2026年10月17日確認)
  2. Microsoft Learn「Subscript out of range (Error 9)」(ms.date 2019-08-14、更新 2024-02-01)(2026年10月17日確認)
  3. Microsoft Learn「Compatibility between the 32-bit and 64-bit versions of Office」(ms.date 2021-10-27、更新 2024-12-18)(2026年10月17日確認)