Excel VBAで業務自動化をしていると、ほぼ確実に一度は出会うエラーがあります。「インデックスが有効範囲にありません(実行時エラー9)」。介護施設の勤務表や配車表をVBAで自動化してきた中で、自分もこのエラーには何度もやられました。
厄介なのは、このエラーメッセージが「何が悪いのか」をほとんど教えてくれないことです。今回は、実際の開発でこのエラーが出た原因と、どう切り分けて直したか、そして再発をどう防いでいるかを整理します。
症状:昨日まで動いていたマクロが、今日は動かない
このエラーの嫌なところは、「コードを1文字も変えていないのに突然出る」ことがある点です。昨日まで正常に動いていた勤務表マクロが、今日実行したらエラーで止まる。コードを見直しても悪いところが見つからない。この時点で、コードではなく「コードが参照している先」を疑うべきなのですが、最初のうちはそれに気づけずコードばかり眺めて時間を溶かしていました。
実際にあった原因たち
自分の環境で実際にこのエラーを引き起こした原因は、だいたい次のどれかでした。
- シート名の不一致:誰かがシート名を手で変更していた。「8月」が「8月」(全角)になっていた、という全角・半角違いのパターンもあります
- ファイル名の変更:参照先のブック名が変わっていて、
Workbooks("〇〇.xlsx")が空振りしていた - 月次生成したシート名の違い:マクロで毎月シートを自動生成する運用だと、生成時の命名規則と参照時の名前がズレることがある
- 存在しないWorkbook/Worksheetへの参照:そもそも開いていないブックを参照していた
共通しているのは、どれも「コードの文法は正しいのに、参照先が実在しない」という構図だということです。
切り分けの手順
エラーが出たとき、闇雲にコードを直す前に、次の順番で確認するようにしています。
- エラーが出た行がどのシート・ブックを参照しているかを特定する
- その名前のシート・ブックが本当に存在するか、目視で確認する
- 存在するように見える場合は、全角・半角、前後の空白を疑う(シート名の末尾に見えない空白が入っていた、というケースが実際にありました)
- 月次生成のシートなら、生成側の命名処理と参照側の名前指定を突き合わせる
特に3番の「見えない空白」は、目視では絶対に気づけません。シート名をコピーしてコードに貼り付ける、あるいはコードでシート名を出力して比較する、といった機械的な確認が確実です。
再発防止:固定名への依存を減らす
何度もこのエラーと付き合った結果、コードの書き方自体を変えることにしました。方針は「固定名への依存を減らし、存在確認・検索・候補判定を入れる」です。
具体的には、シートを参照する前に存在チェックを挟む、シート名を完全一致で決め打ちせず候補から検索する、参照に失敗したら分かりやすいメッセージを出して止める、といった作りにしています。ひと手間増えますが、「エラーで止まって原因が分からない」状態と、「〇〇シートが見つかりませんと表示されて止まる」状態では、その後の対応時間がまったく違います。
この経験からの教訓
現場で使うExcelは、開発者だけが触るものではありません。誰かがシート名を変える、ファイルをコピーして名前を変える、といったことは日常的に起こります。「参照先は変わるもの」という前提でコードを書くこと。これが、このエラーと付き合ってきた一番の学びです。
同じエラーで困っている方は、まずコードではなく「参照先の名前」から疑ってみてください。原因の大半は、たぶんそこにあります。
AI介護士kaze運営者。介護福祉士・ケアマネジャー・社会福祉士の資格を持ち、介護現場歴18年。現場のリアルな課題感を起点に、AI×介護の実用性を探求・発信しています。


コメント