昨日まで普通に動いていたはずのExcelマクロが、今日は実行するたびに固まる。あるいは、いつものボタンを押しただけなのに、見慣れない赤いエラー画面が出て処理が止まってしまった。中身のコードを書いた本人はもう社内にいない。エラーメッセージに書かれている英数字の羅列を検索窓にコピーしても、専門用語だらけの掲示板が並ぶばかりで、何をどうすればよいのか見当がつかない。今日も月末の締め処理を待っている経理担当者から「まだですか」と聞かれ、冷や汗をかいている。そんな状況を想定した記事です。

先に結論から言います。Excelマクロの不調は「遅くなった」と「エラーで止まった」の2系統に分かれ、それぞれ原因の探し方がまったく異なります。遅くなった場合はExcelの画面更新・自動計算・イベント処理という3つの「裏側の処理」が過剰に走っていないかを疑い、エラーで止まった場合はエラーメッセージの番号と、直前に何を変更したかという2点をまず特定することが最短ルートです。どちらのケースも、いきなりコードを書き換えるのではなく、まず状況を正しく切り分けることが遠回りに見えて一番の近道になります。

この記事で分かること

この記事は、長年使ってきたVBAマクロの動作が急に重くなった、あるいは今まで出なかったエラーが突然出るようになり、原因も直し方も分からず困っている担当者を対象にしています。マクロのコードそのものを一から読み解く方法(解読方法)ではなく、「なぜ不調になったのか」を切り分け、応急処置と根本対処のどちらを取るべきかを判断するための実務ガイドです。

すでに動いているマクロの中身をじっくり読み解きたい場合は、別記事「「作った人しか分からない」ExcelマクロとVBAを今いる人だけで解読する方法」で、マクロの記録機能やデバッグ機能を使った解読手順を詳しく解説しています。本記事はその前段階、つまり「まず何が起きているのかを見極める」ところに焦点を当てます。

扱う範囲は次の順序で進みます。

  • 切り分け: 「遅い」と「エラーで止まる」のどちらに当てはまるかを最初に判定する
  • 遅い場合: 動作が重くなる典型的な原因と、コードを読まずにできる応急処置
  • エラーの場合: エラーメッセージの読み方と、よくあるエラー番号ごとの対処
  • 環境変化: OSやOfficeのアップデートが引き金になるケースの見分け方
  • データ量: 長年の運用でデータが膨れ上がったことが原因のケース
  • 応急処置と根本対処の使い分け: その場をしのぐか、作り直すかの判断基準
  • 再発防止: 同じトラブルを繰り返さないための最低限の備え

順番に見ていきます。

なぜ「昨日まで動いていたマクロ」が急におかしくなるのか

まず押さえておきたいのは、VBAマクロは魔法のように壊れるわけではなく、必ず何らかの「きっかけ」があるという点です。きっかけを知っておくと、目の前のトラブルがどの系統に属するのか見当がつきやすくなります。

主なきっかけは次の4つに大別できます。

  1. データ量が増え続けている。マクロが処理する行数・シート数が、作られた当初より大幅に増えている
  2. Officeやパソコンが更新された。Windows UpdateやMicrosoft 365の自動更新、パソコンの入れ替えなどをきっかけに、実行環境が変わった
  3. ファイルやフォルダの構成が変わった。参照先のファイル名・保存場所・シート名が変更・削除された
  4. 他の担当者がコードや設定を触った。良かれと思って手を加えた変更が、意図しない副作用を生んだ
実務上の視点: 「何もしていないのに壊れた」という感覚は、多くの場合正確ではありません。マクロを動かす環境(Windows・Office・保存先のファイルサーバーやクラウド)のどこかが変化した結果、これまで隠れていた問題が表面化しただけ、というケースが大半です。犯人探しをする必要はありませんが、「直前に何が変わったか」を思い出すことが、原因特定の一番の近道になります。

ステップ1 「遅い」か「止まる」かをまず切り分ける

トラブルシューティングの最初の一歩は、症状を正確に言葉にすることです。感覚的に「調子が悪い」とまとめてしまうと、原因の探索範囲が無駄に広がってしまいます。次の質問に答えて、自分の状況がどちらに近いかを確認してください。

「遅い」系統と「エラー」系統の切り分けと、それぞれの疑うべき原因・応急処置を示す意思決定ツリー

質問「遅い」系統「エラー」系統
マクロは最後まで終わる?時間はかかるが最終的に終わる途中で処理が止まり、それ以上進まない
画面に何か表示される?特にメッセージは出ない、または砂時計・くるくるが出続ける「実行時エラー」などのダイアログが表示される
以前との違いは?同じ操作なのに完了までの体感時間が長くなった今まで出なかった画面が新しく出るようになった
再現性は?毎回遅い、または特定の操作のときだけ遅い特定の操作・特定のデータのときだけ発生する、または毎回発生する

「遅い」と「止まる」が同時に起きているように見える場合も、まず片方ずつ切り分けてください。多くの場合、時間切れによるタイムアウトのようなエラー(他システムとの連携処理など)を除けば、遅さとエラーは別の原因から発生しています。以降のセクションでは、この2系統に分けて原因と対処を解説します。

「遅くなった」場合の原因と対処

Excelの裏側で起きていること

VBAマクロは、Excelの画面上で見えている部分の裏側で、何度も「再計算」「画面の再描画」「イベントの検知」を行っています。マクロが1つのセルを書き換えるたびに、関連する数式がすべて再計算され、画面もそのたびに更新される、という挙動が既定の設定です。数行程度の処理であれば気になりませんが、数百行・数千行にわたってセルを1つずつ処理するマクロでは、この裏側の処理そのものが体感速度の大部分を占めてしまいます。

マイクロソフトの公式ドキュメントでも、VBAマクロの実行中に次の4つの機能を一時的にオフにし、処理が終わったら元に戻すことで、パフォーマンスが大きく改善すると案内されています。

  • 画面の更新(Application.ScreenUpdating): 処理中の画面の再描画を止め、完了後に1回だけ更新する
  • 自動計算(Application.Calculation): 数式の再計算を「手動」に切り替え、処理完了後にまとめて計算する
  • イベントの検知(Application.EnableEvents): 他のマクロや仕組みが連鎖的に反応するのを一時的に止める
  • ステータスバーの表示(Application.DisplayStatusBar): 進捗表示の更新を止める
一次情報: Microsoft Learn「Excel のパフォーマンス - パフォーマンスの障害を最適化するためのヒント」では、「コードの実行中に不要な機能を明示的にオフにします。多くの場合、コードの実行後に1つの再計算または1つの再描画が必要であり、パフォーマンスを向上させることができます」と説明されています。あわせて、セルを1つずつループで読み書きするのではなく、配列としてまとめて読み書きする方法や、.Value2(セルの値をそのまま取得する高速な方法)を使うことも推奨されています。

これらの設定変更は、コードの解読が難しくても「マクロの先頭に数行を追加する」だけで試せる場合が多く、社内で最初に試す価値のある応急処置です。ただし、既存のコードの構造によっては単純に追加できない場合もあるため、慎重に試し、必ずコピーしたファイルで検証してから本番に反映してください。

データ量の増加が疑わしいとき

マクロが作られた当初は数百行だったデータが、日々の運用で数万行にまで膨れ上がっているケースは非常に多く見られます。特に、次のような処理はデータ量の増加に比例して、あるいはそれ以上のペースで時間がかかるようになります。

  • セルを1つずつループしながら条件判定やコピー貼り付けを行う処理
  • VLOOKUP関数などを、範囲を広く取りすぎた状態でセルの数だけ実行している処理
  • 使用範囲(セルにデータや書式が一度でも入った履歴のある範囲)が、実際に使っているデータよりはるかに広がっている状態

最後の「使用範囲」の肥大化は見落とされがちです。以前に入力していたデータを削除しても、Excel内部では「そこに何かがあった」という情報が残り続けることがあり、Ctrl+Endキーで実際のデータ範囲を大きく超えたセルにジャンプする場合は、この状態に該当します。ファイルサイズの増大や、開くだけで時間がかかる症状の原因にもなります。

実務上の視点: 「遅い」というクレームが来たら、まず「いつから遅いか」「そのときデータは何件くらいだったか」を聞き取ってください。1年前は数分だった処理が、今は数十分かかっているなら、コードの不具合よりもデータ量の増加が主因である可能性が高くなります。

すぐ試せる応急処置のチェックリスト

コードを本格的に読み解く前に、次の項目を順に確認してください。上から順に、コードへの影響が小さいものを並べています。

  • [ ] パソコンを再起動し、他に開いているアプリケーションを閉じてから再実行する
  • [ ] 対象のExcelファイル以外を全て閉じ、単独で実行する
  • [ ] Ctrl+Endキーで実際のデータ範囲を超えたセルにジャンプしないか確認する(超える場合は使用範囲の肥大化を疑う)
  • [ ] ファイルの保存形式が.xlsm(マクロ有効ブック)になっているか確認する。.xls形式のまま長年運用されている場合、形式の変更だけで改善することがある
  • [ ] ウイルス対策ソフトのリアルタイムスキャン対象からファイルの保存フォルダを一時的に除外し、変化を見る(セキュリティ部門への確認は必須)
  • [ ] 保存先が社内サーバーやクラウド同期フォルダ(OneDriveなど)の場合、ネットワークの遅延が影響していないか、ローカルにコピーしたファイルで実行速度を比較する

これらを試しても改善しない場合は、コードの内部構造(ループ処理・関数の使い方)に踏み込む必要があり、前述の関連記事「解読する方法」の手順が役立ちます。

「エラーで止まる」場合の原因と対処

エラーメッセージはヒントの宝庫

エラーで処理が止まったとき、多くの人はダイアログを「はい」や「OK」で反射的に閉じてしまいますが、これは大きな機会損失です。エラーメッセージには、次の2つの重要な情報が含まれています。

  1. エラー番号(「実行時エラー '1004':」のような数字)
  2. エラーの内容を説明する短い文章

この2つをメモに書き写す、あるいはスマートフォンで写真を撮ってから閉じる習慣をつけてください。エラー番号が分かれば、インターネット検索でも情報が見つけやすくなりますし、後で開発会社に相談する際にも状況を正確に伝えられます。

引用: Microsoft Learnの解説では、VBAの実行時エラーは「Errオブジェクト」というエラー情報を格納する仕組みを通じて扱われ、「エラー処理ルーチンは、エラーの原因を特定するためにErrオブジェクトのNumberプロパティの値に依存します」とされています。つまりエラー番号こそが、原因を特定するための最も基本的な手がかりだということです。

よくあるエラーの傾向と、コードを読まずにできる確認

すべてのエラーを網羅することはできませんが、非エンジニアでも状況証拠から見当をつけやすい、よくある傾向を紹介します。

よくあるエラーの症状の傾向・疑わしい原因・まず確認することを整理した対応表の図

症状の傾向疑わしい原因まず確認すること
「ファイルが見つかりません」系のエラーマクロが参照している別のファイルの名前・保存場所が変わった、またはファイルが削除されたそのマクロが日常的に読み込んでいる他のExcelファイルやCSVファイルの保存場所・ファイル名が最近変わっていないか
「オブジェクトが必要です」「型が一致しません」系のエラーシート名の変更、列や行の挿入・削除でセルの位置がずれた最近、シート名を変えたり、表の途中に列や行を挿入・削除した人がいないか
「アプリケーション定義または オブジェクト定義のエラー」系のエラー(実行時エラー1004など)保護されたシート・セルへの書き込み、印刷範囲やグラフの参照範囲の不整合など、状況依存の要因が幅広いエラーが出る直前の操作、シートの保護設定の有無、直前にコピー貼り付けした内容
メールやOutlook・他システムとの連携でエラー連携先のソフトのバージョンが変わった、セキュリティ設定が変更された情報システム部門やパソコンの管理者に、直近のアップデート内容を確認する
権限系・アクセス拒否のエラー保存先フォルダの権限設定が変更された、共有設定が変わった同じマクロを別の人のパソコンで実行しても同じエラーになるか確認する

これらの確認は、コードを1行も読まなくても進められます。特に「最近、誰が何を変更したか」という聞き取りは地味ですが効果が高く、開発会社に相談する前に済ませておくと、調査時間の短縮にもつながります。

「原因不明のエラー」を切り分ける3つの質問

情報が少なく手詰まりに感じたときは、次の3つの質問で状況を整理してください。

  • 再現性はあるか: 毎回同じ操作で発生するのか、特定のデータのときだけ発生するのか、時々しか発生しないのか。再現性が低いエラーほど、ネットワークやメモリ不足など環境要因が疑わしくなります
  • 他のパソコンでも起きるか: 同じファイルを別のパソコンで開いて実行しても同じエラーが出るなら、ファイル側(コードやデータ)に原因がある可能性が高くなります。特定のパソコンでしか起きないなら、そのパソコンのOffice設定や更新状況を疑います
  • いつから起きているか: エラーが出始めた日付が分かれば、その前後にあったOSやOfficeの更新、パソコンの入れ替え、担当者の異動と重ね合わせて、きっかけを絞り込めます

これらの答えを整理しただけで、「誰に何を相談すればよいか」の見当がつくことも多くあります。例えば「特定のパソコンでだけ起きる」なら情報システム担当や利用者本人の環境確認で足りますが、「全員の環境で再現する」ならコード自体、あるいは参照先データの問題である可能性が高くなります。

環境の変化がきっかけになるケース

OSやOfficeの更新は「静かに」影響する

VBAマクロにとって特に見落とされやすいのが、パソコン自体やOfficeソフトのアップデートです。Windows UpdateやMicrosoft 365の更新は自動的に行われることが多く、担当者が意識しないうちにセキュリティ設定や内部の挙動が変わっていることがあります。

代表的な影響としては、次のようなものが挙げられます。

  • マクロのセキュリティ設定の変更によって、これまで自動的に有効化されていたマクロが警告表示に変わり、ボタンを押しても実行されなくなる
  • 暗号化・保護の仕組みの強化によって、シートの保護・保護解除を繰り返すようなマクロの動作が、以前より重く(遅く)感じられるようになる。実際に、シートの保護・解除を伴うマクロの実行速度低下について、より強力なハッシュアルゴリズムへの変更が影響するケースがマイクロソフトのトラブルシューティング情報でも取り上げられています
  • 他のソフトとの連携部分(自動化)の仕様変更によって、これまで正常に動いていた外部ソフトとの連携処理でエラーが発生するようになる
実務上の視点: 「何も変えていないのにおかしくなった」と感じたときほど、パソコンの更新履歴を確認する価値があります。Windowsの設定から更新の履歴を確認できるほか、パソコンの入れ替え・OSの大型アップデートのタイミングも、情報システム担当や購買記録から把握できることがあります。この確認を後回しにすると、コードの内部に原因があると決めつけて無駄な調査時間を費やしてしまいがちです。

新しいパソコンへの移行がきっかけになる典型例

担当者の異動やパソコンの入れ替えのタイミングで、これまで動いていたマクロが急に動かなくなったという相談も少なくありません。典型的な原因を整理します。

  1. ファイルパスの違い。マクロの中で「Cドライブの特定のフォルダ」のように、決め打ちの保存場所を参照している場合、新しいパソコンでは同じ場所にファイルがなくエラーになる
  2. Officeのバージョン差。古いパソコンでは動いていた機能が、新しいバージョンのOfficeでは仕様が変わっている、あるいは廃止されている
  3. アドイン・参照設定の不足。マクロが特定の拡張機能(参照設定)に依存している場合、新しいパソコンにその設定が引き継がれず、実行時にエラーになる
  4. 32ビット版と64ビット版の違い。古いマクロの一部のコードが32ビット版のOfficeを前提に書かれている場合、64ビット版で動かすとエラーになることがある

いずれのケースも、コードそのものが壊れたわけではなく、「動作環境の前提が変わった」ことが原因です。異動や入れ替えの直後に不調が始まった場合は、まずこの観点から確認すると原因の絞り込みが早くなります。

応急処置と根本対処、どちらを選ぶべきか

その場をしのぐことの意味とリスク

締め処理や請求書発行の期限が迫っている状況では、根本原因を突き止めるより先に、まず今日の業務を終わらせる必要があります。応急処置には次のような選択肢があります。

  • 遅いだけで最終的には終わる場合は、時間に余裕を持って実行し、待つ
  • エラーが特定の操作でだけ発生する場合は、その操作を手作業で代替する
  • 直前の変更(シート名の変更など)に心当たりがあれば、いったん元に戻してみる
  • どうしても動かない場合は、マクロを使わず、対象のシートを手作業で処理する

これらはあくまで「今日をしのぐ」ための手段であり、原因を解消したわけではありません。応急処置で乗り切った後は、必ず根本原因の調査に戻る時間を確保してください。応急処置を繰り返しているうちに「実はこのマクロ、もう半分手作業になっている」という状態が常態化し、誰にも気づかれないまま属人化がさらに進んでしまうケースをよく見かけます。

根本対処に進むべきサイン

次のいずれかに当てはまる場合は、応急処置で終わらせず、根本的な対処(コードの修正・作り直し・システムへの移行検討)に進むことを検討してください。

  • 同じエラーが月に何度も繰り返し発生している
  • 遅さが年々悪化しており、業務時間を明確に圧迫し始めている
  • 応急処置(手作業での代替)にかかる時間が、マクロが本来担っていた作業時間を超えている
  • エラーの原因が分からないまま、複数人が場当たり的にコードを触り始めている
実務上の心構え: マクロの不調は「たまたま今回だけ」に見えても、根っこには「誰も全体像を把握していない」という属人化の問題が隠れていることが多くあります。応急処置で対応した内容は、簡単でよいので必ず記録に残してください。次に同じ症状が出たとき、あるいは別の担当者が引き継いだときに、同じ調査をゼロからやり直さずに済みます。

開発会社に相談する場合に準備しておくこと

自力での切り分けに限界を感じ、外部の開発会社やこれまで付き合いのあるベンダーに相談する場合、次の情報を事前に整理しておくと、やり取りがスムーズになり、無駄な追加費用も発生しにくくなります。

  • エラーメッセージの正確な文言とエラー番号(スクリーンショットが最も確実)
  • 症状が「遅い」のか「止まる」のか、いつから始まったか
  • 直前に変更した心当たり(シート名、パソコンの入れ替え、Office更新など)
  • 対象のExcelファイル(可能であれば個人情報を除いたコピー)
  • これまでに試した応急処置とその結果

これらを整理しておくと、相談先の技術者が最初の状況把握にかける時間を大幅に短縮でき、結果として調査費用や対応スピードにも良い影響があります。逆に「とにかく動かないので見てほしい」とだけ伝えると、状況の聞き取りだけで初回の打ち合わせが終わってしまうことも珍しくありません。

再発防止のためにできること

コードを直せなくても、記録は残せる

VBAのコードを自分で書き換えられなくても、トラブルの記録を残すことは誰にでもできます。次のような簡単なメモを、Excelファイルとは別に(壊れる可能性のある場所とは別に)残しておくことをおすすめします。

  • いつ、どんな症状が起きたか
  • 直前に何を変更したか、心当たりはあったか
  • どう対処して解決した(あるいは応急処置でしのいだ)か
  • 相談した先(開発会社・詳しい同僚など)と、そのときの回答

このような記録は、システム管理台帳の一部として蓄積していくと、担当者が変わっても過去のトラブル対応が引き継がれ、同じ調査を繰り返す無駄がなくなります。特にVBAマクロは属人化しやすい仕組みであるため、「動いていた」という結果だけでなく「どう不調になり、どう直したか」という経緯こそが、次の担当者にとって価値のある情報になります。

バックアップの習慣を見直す

マクロの不調をきっかけに、ファイルのバックアップ体制そのものを見直す機会にしてください。特に、コードを修正する前の状態のファイルを必ず別名で保存しておく習慣がないと、応急処置のつもりで行った変更が元に戻せなくなり、被害が拡大するリスクがあります。

  • 修正を試す前に、必ず日付入りのファイル名でコピーを作成する
  • 定期的な自動バックアップ(クラウド同期やファイルサーバーの世代管理機能)が有効になっているか確認する
  • バックアップからの復元を実際に試したことがあるか確認する(バックアップは「取ってあるつもり」で復元できないケースが少なくありません)

長期的には「脱マクロ」も選択肢に入れる

今回のトラブルが軽微な応急処置で解決したとしても、同じマクロが今後何年も同じ担当者不在の状態で運用され続けるなら、いずれ同じ種類のトラブルが繰り返されることは避けられません。データ量が今後も増え続ける前提であれば、マクロの延命ではなく、ノーコード・ローコードツールや専用システムへの移行を中長期の選択肢として検討する価値があります。

自社のExcel運用がどの程度「危険な状態」にあるかを客観的に把握したい場合は、まず自己診断から始めることをおすすめします。判断の基準や具体的な移行の進め方については、カテゴリ内の他記事で詳しく解説しています。

まとめと次に読むべき記事

Excelマクロの不調は、「遅い」と「エラーで止まる」を最初に切り分け、直前の環境変化(データ量・OS/Officeの更新・パソコンの入れ替え・他の担当者による変更)を手がかりに原因を絞り込むことで、コードを読み解かなくてもかなりのところまで対処できます。応急処置でその場をしのぐこと自体は悪いことではありませんが、必ず記録を残し、繰り返し発生するようであれば根本対処や脱マクロの検討に進んでください。

マクロのコードそのものをじっくり読み解きたい場合は、「「作った人しか分からない」ExcelマクロとVBAを今いる人だけで解読する方法」で、非エンジニアでも実践できる解読の手順を解説しています。あわせて、そもそも自社のExcel運用がどの程度危険な状態にあるかを確認したい場合は、危険度サインのチェックリストや、脱Excelの判断フローもあわせてご覧ください。