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

コラム仕組みと実験

列を追加するとマクロの集計はずれる?シート名など10通りの変更をExcelで試した

表に列を追加したりシート名を変えたりしたときのマクロの壊れ方は、エラーで止まるものと、止まらずに集計がずれるものに分かれます。危ないのは後者です。架空の受注集計マクロ(64行)に10通りの変更を加えてExcelで動かすと、止まるが5つ、違う答えが4つ、正しく動いたのは1つでした。列を1つ挿入すると、税込の合計は正しい2,607,946円のところ91,564円と出ました。マクロの守りの実験です(2026年10月時点)。

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

要点

  • 列の挿入や見出しの上の行は、エラーを出さずにマクロの集計を変えました。
  • 架空の受注集計マクロに10通りの変更をすると、止まる5・違う答え4・動く1でした。
  • 列を1つ挿入すると、税込の合計が2,607,946円から91,564円になり、エラーは出ませんでした。
  • シート名の変更とファイル名の変更は、どちらも同じ「インデックスが有効範囲にありません」で止まりました。
  • 列を見出しの文字で探すなどの書き方に直すと、10通りのうち9つで正しい合計が出ました。
目次
  1. シート名や列を変えると、マクロはどう壊れますか?
  2. 列を挿入すると、なぜエラーなしで集計がずれるのですか?
  3. マクロが止まるときは、どんな文面が出ますか?
  4. 違う答えに気づくには、どうすればよいですか?
  5. 表の形を変えても壊れにくいマクロにするには?
  6. この実験の結果は、どのマクロにも当てはまりますか?
  7. このサイトで相談するには?
  8. よくある質問

シート名や列を変えると、マクロはどう壊れますか?

壊れ方は「止まる」と「止まらずに違う答えを出す」の2つに分かれ、気づきにくいのは後者です。架空の受注集計マクロに10通りの変更をすると、止まるが5つ、違う答えが4つでした。正しく動いたのは、日付の表示を変えた1つだけです。読み解きから直すまでの全体は、Excelマクロの引き継ぎにまとめています。

試したのは、マクロの守りで書いた64行のマクロです。架空の受注の明細60行(うち10月分46行)を得意先ごとに足し、消費税を付けて別のシートに書きます。

シート名・ブック名・列の番号・設定のセルは直書きし、得意先マスタは絶対パスで開く、古いマクロによくある書き方です。Excel 16.0(ビルド20430、64bit)をCOMから動かし、Pythonで計算した正解と突き合わせました。

変更 結果 出た文面・数字
シート名を変える 止まる インデックスが有効範囲にありません(9)
途中に列を挿入する 違う答え 税込 91,564円(正しくは 2,607,946円)
見出しの上に行を足す 違う答え 0円
得意先のセルを結合する 違う答え 0円
.xlsxで保存し直す 止まる マクロが残らない
フォルダごと移す 止まる 得意先マスタ.xlsxが見つかりません(1004)
ファイル名を変える 止まる インデックスが有効範囲にありません(9)
日付を和暦の表示にする 動く 正解と一致
税率の上に行を足す 違う答え 0円
32bitのDeclare文を足す 止まる マクロを実行できません
10通りの変更の結果の表。元の書き方では止まる5、違う答え4、動く1。直した書き方では.xlsxで保存し直した1つだけが止まり、ほかの9つは正しく動いた10通りの変更で、受注集計マクロはどうなったか架空の明細60行(10月分46行)。Excel 16.0(ビルド20430、64bit)を COM から動かし、正解と突き合わせた元の書き方直した書き方1. シート名を変える止まる動く2. 途中に列を挿入する違う答え動く3. 見出しの上に行を足す違う答え動く4. 得意先のセルを結合する違う答え動く5. .xlsx で保存し直す止まる止まる6. フォルダごと移す止まる動く7. ファイル名を変える止まる動く8. 日付を和暦の表示にする動く動く9. 税率の上に行を足す違う答え動く10. 32bit の Declare 文を足す止まる動く数止まる5・違う答え4・動く1止まる1・違う答え0・動く9主宰が 2026-10-16 に macro_breaks.py で再現(架空のデータ、種 20261016)
図1 10通りの変更の結果。右の列は、同じ変更を壊れにくい書き方のマクロで試し直した結果です。マクロの守りが2026年10月16日に試しました。

列を挿入すると、なぜエラーなしで集計がずれるのですか?

マクロが列を番号で読んでいると、挿入した列のぶんだけ、読む中身が右隣の列にずれるからです。番号の指す先に数字が入っている限り、マクロは何も言わずに足し続けます。

実験のマクロは、4列目を数量、6列目を金額として読みます。得意先コードの右に「得意先名」の列を挿入すると、4列目は品番に、6列目は単価に変わりました。品番は5けたの数字なので、数量の合計は1,258のはずが2,218,855になり、税込の合計は91,564円と出ました。正しい金額の約3.5%です。

列のずれの図。得意先名の列を3列目に挿入すると、4列目が数量から品番に、6列目が金額から単価に変わり、数量の合計は2,218,855、税込は91,564円と出た列を1つ挿入すると、マクロが読む列が1つずつずれるマクロは Cells(r, 4) を数量、Cells(r, 6) を金額として読む(列の番号の直書き)変更前1列目受注日2列目得意先コード3列目品番4列目数量5列目単価6列目金額「得意先名」を3列目に挿入した後1列目受注日2列目得意先コード3列目得意先名4列目品番5列目数量6列目単価7列目金額Cells(r, 4)Cells(r, 6)結果:エラーは出ず、数量の合計は 2,218,855(品番の数字の合計。正しくは 1,258)税込の合計は 91,564円(単価の合計に税を足した値。正しくは 2,607,946円)品番が「P-12345」のように英字入りなら、数量に文字を足そうとして「型が一致しません」で止まった
図2 列を1つ挿入したときのずれ。品番が「P-12345」のような英字入りなら、文字を足せずに「型が一致しません」で止まりました。

見出しの上にタイトル行と空行を足したときは0円でした。マクロは表の範囲をCurrentRegionで決めています。Microsoftの説明では、これは空の行と列で囲まれた範囲です。空行で区切られ、範囲がA1の1行だけになりました。

設定シートの税率の上に「軽減税率」の行を足したときも0円です。税率のセルには8%が、集計する月のセルには0.1が入り、月が1件も合いませんでした。

マクロが止まるときは、どんな文面が出ますか?

止まったときの文面は、原因をそのまま教えてくれるとは限りません。実験では、シート名の変更とファイル名の変更が、どちらも「インデックスが有効範囲にありません」(エラー9)でした。マクロが「受注」というシートと「受注集計.xlsm」というブックを、名前で探しているためです。

フォルダごと移したときは、得意先マスタの元のパスが文面に出ました。

分かりにくかったのは、PtrSafeのないDeclare文を1行足したときです。外から呼ぶと「マクロ ‘…’ を実行できません。このブックでマクロが使用できないか…」と出ました。セキュリティの設定を疑いたくなる文面です。

Microsoftの互換性の説明によると、PtrSafeのないDeclare文は、64bitのOfficeではコンパイルエラーです。同じ文にPtrSafeを付けると、マクロは正しく動きました。.xlsxで保存し直したブックは、開き直すと標準モジュールが0個で、マクロは残っていませんでした。

違う答えに気づくには、どうすればよいですか?

正しい答えが分かっている月で、マクロの合計と手で数えた合計を突き合わせるのが確実です。表の形を変えたら、変えた日のうちに1回だけ試します。

税込の合計の横棒グラフ。正しくは2,607,946円。列の挿入では91,564円、見出しの上の行・セルの結合・税率の行では0円が、エラーなしで出たエラーなしで出た税込の合計(正解 2,607,946円との比較)4つの変更は、どれもエラーを出さずに集計シートを書き換えた正しい答え(変更なし)2,607,946円途中に列を挿入91,564円品番と単価を足した見出しの上に行0円空行で表の範囲が1行に得意先のセルを結合0円各得意先の先頭行(9月分)だけ読んだ税率の上に行0円集計月のセルに税率架空の明細60行で再現(macro_breaks.py)。0円の3つは集計シートに合計の行だけが残った
図3 エラーなしで出た税込の合計。0円の3つは、集計シートに合計の行だけが残りました。

0円なら気づけますが、列の挿入の91,564円のように、それらしい数字が出ると見逃しやすくなります。確かめるのは次の3つです。

  1. 件数が明細の行数と合うか(実験の正解は10月分46件)
  2. 合計が、フィルターをかけて手で足した値と合うか
  3. 得意先の数と名前が、いつもの月と比べて欠けていないか

セルの結合は、件数の確かめで見つかります。実験では結合したセルの2行目以降が空として読み飛ばされ、残った各得意先の先頭行は9月分でした。

表の形を変えても壊れにくいマクロにするには?

列は見出しの文字で探し、シートはコード名で指す書き方に直すと、10通りのうち9つで正しい合計が出ました。止まったのは、マクロ自体が消える.xlsxの保存だけです。

直した版は78行で、同じ集計をします。直したのは次の7か所です。

  • シートはコード名で書く(シート名を変えてもコード名は変わらないとMicrosoftは説明しています)
  • 列は見出しの「数量」「金額」を探して番号を決める
  • 最終行はEnd(xlUp)で数え、見出しの行も「受注日」を探して決める
  • 結合したセルは、結合範囲の左上の値を読む
  • 税率と集計する月は、名前を付けたセルから読む
  • 得意先マスタはThisWorkbook.Pathから開き、ブックはThisWorkbookで指す
  • Declare文は#If VBA7で書き分けてPtrSafeを付ける

要点は、列の番号を見出しから決める数行です。

Set f = ws.Range("A1:J20").Find("受注日", LookAt:=xlWhole)
hdr = f.Row
colQty = 列番号(ws, hdr, "数量")   ' 中は Application.Match で見出しを探す
colAmt = 列番号(ws, hdr, "金額")
lastRow = ws.Cells(ws.Rows.Count, colDate).End(xlUp).Row
code = CStr(ws.Cells(r, colCode).MergeArea.Cells(1, 1).Value)

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

当てはまるのは、同じ書き方をしている行です。壊れ方は変更の種類よりも、マクロがその場所をどう指しているかで決まります。

実験のマクロは、CurrentRegionで最終行を数えていました。最終行を別の書き方で数えるマクロなら、同じ変更でも結果は変わりえます。同じマクロでも、表の右端に列を足したときは正しく動き、品番が英字入りのときは列の挿入で止まりました。

再現の手順は、macro_breaks.py(直した版は –fixed)にまとめています。データは乱数の種20261016で作った架空のもので、ボタンから動かしたときの画面の文面は確かめていません。手元のマクロでは、直書きの行を数えてから表を変えるのが安全です。どのシートを名前で読み書きしているかの数え方は、呼び出し関係とシートの読み書きの図の記事にあります。

止まったときに出る番号の読み方は、実行時エラー1004・9・13・91の読み方にあります。

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

表を直したら合計がおかしくなったマクロも、マクロの守りで、どの行が位置を直書きしているかを一緒に見ます。何をどう頼むか決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。

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

よくある質問

シート名を変えても止まらないマクロにできますか?
できます。シートをコード名(VBEのプロパティの「(オブジェクト名)」)で書くと、シート名を変えても同じシートを指します。実験でも、コード名で書いた版は正しく動きました。
マクロ付きのブックを.xlsxで保存してしまったら、戻せますか?
いいえ、.xlsxからは戻せません。実験でも開き直すと標準モジュールは0個でした。保存し直す前の.xlsmか、バックアップから戻します。
列を足したいときは、どこに足せば安全ですか?
表の右端なら、実験のマクロは正しく動きました。ただしマクロが右端の列を読む書き方なら、右端でも結果が変わります。足す前に、マクロが列の番号を直書きしていないかを確かめます。
「マクロを実行できません」と出たら、セキュリティの設定が原因ですか?
そうとは限りません。実験では、PtrSafeのないDeclare文を1行足しただけで同じ文面が出ました。VBEで[デバッグ]→[コンパイル]を押すと、原因の行が分かります。

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

シート名・列などを変える10通り。元の書き方と直した書き方を、手元のデスクトップ版 Excel で実行。2026年10月16日。

出典

  1. Microsoft Learn「Compatibility between the 32-bit and 64-bit versions of Office」(2024年12月更新)(2026年10月16日確認)
  2. Microsoft Learn「Range.CurrentRegion property (Excel)」(2026年10月16日確認)
  3. Microsoft Learn「Worksheet.CodeName property (Excel)」(2026年10月16日確認)