VBA「インデックスが有効範囲にありません」で1日溶かした話

介護DX
Photo by Rubaitul Azad on Unsplash

Excel VBAで業務自動化をしていると、ほぼ確実に一度は出会うエラーがあります。「インデックスが有効範囲にありません(実行時エラー9)」。介護施設の勤務表や配車表をVBAで自動化してきた中で、自分もこのエラーには何度もやられました。

厄介なのは、このエラーメッセージが「何が悪いのか」をほとんど教えてくれないことです。今回は、実際の開発でこのエラーが出た原因と、どう切り分けて直したか、そして再発をどう防いでいるかを整理します。

症状:昨日まで動いていたマクロが、今日は動かない

このエラーの嫌なところは、「コードを1文字も変えていないのに突然出る」ことがある点です。昨日まで正常に動いていた勤務表マクロが、今日実行したらエラーで止まる。コードを見直しても悪いところが見つからない。この時点で、コードではなく「コードが参照している先」を疑うべきなのですが、最初のうちはそれに気づけずコードばかり眺めて時間を溶かしていました。

実際にあった原因たち

自分の環境で実際にこのエラーを引き起こした原因は、だいたい次のどれかでした。

  • シート名の不一致:誰かがシート名を手で変更していた。「8月」が「8月」(全角)になっていた、という全角・半角違いのパターンもあります
  • ファイル名の変更:参照先のブック名が変わっていて、Workbooks("〇〇.xlsx")が空振りしていた
  • 月次生成したシート名の違い:マクロで毎月シートを自動生成する運用だと、生成時の命名規則と参照時の名前がズレることがある
  • 存在しないWorkbook/Worksheetへの参照:そもそも開いていないブックを参照していた

共通しているのは、どれも「コードの文法は正しいのに、参照先が実在しない」という構図だということです。

切り分けの手順

エラーが出たとき、闇雲にコードを直す前に、次の順番で確認するようにしています。

  1. エラーが出た行がどのシート・ブックを参照しているかを特定する
  2. その名前のシート・ブックが本当に存在するか、目視で確認する
  3. 存在するように見える場合は、全角・半角、前後の空白を疑う(シート名の末尾に見えない空白が入っていた、というケースが実際にありました)
  4. 月次生成のシートなら、生成側の命名処理と参照側の名前指定を突き合わせる

特に3番の「見えない空白」は、目視では絶対に気づけません。シート名をコピーしてコードに貼り付ける、あるいはコードでシート名を出力して比較する、といった機械的な確認が確実です。

再発防止:固定名への依存を減らす

何度もこのエラーと付き合った結果、コードの書き方自体を変えることにしました。方針は「固定名への依存を減らし、存在確認・検索・候補判定を入れる」です。

具体的には、シートを参照する前に存在チェックを挟む、シート名を完全一致で決め打ちせず候補から検索する、参照に失敗したら分かりやすいメッセージを出して止める、といった作りにしています。ひと手間増えますが、「エラーで止まって原因が分からない」状態と、「〇〇シートが見つかりませんと表示されて止まる」状態では、その後の対応時間がまったく違います。

この経験からの教訓

現場で使うExcelは、開発者だけが触るものではありません。誰かがシート名を変える、ファイルをコピーして名前を変える、といったことは日常的に起こります。「参照先は変わるもの」という前提でコードを書くこと。これが、このエラーと付き合ってきた一番の学びです。

同じエラーで困っている方は、まずコードではなく「参照先の名前」から疑ってみてください。原因の大半は、たぶんそこにあります。


AI介護士kaze運営者。介護福祉士・ケアマネジャー・社会福祉士の資格を持ち、介護現場歴18年。現場のリアルな課題感を起点に、AI×介護の実用性を探求・発信しています。

コメント

タイトルとURLをコピーしました