VBA実行時エラー9「インデックスが有効範囲にありません」が出た時に確認した4つの場所

毎日使うExcelマクロが、急に止まった経験はありませんか。「実行時エラー9」というメッセージが出ることがあります。非エンジニアの私たちは、直し方が分からず途方に暮れますよね。私も同じような経験を何度もしてきました。

これはVBAが参照する「何か」が見つからないときに発生します。存在しないシート名の指定などが代表例です。メッセージだけでは原因が分かりづらいですよね。コードを一つ一つ確認していくしかありません。

本記事では、私がエラー9に遭遇した際の実体験をお話しします。どのように原因を特定し、解決してきたかの手順をご紹介しましょう。非エンジニアの視点から、見落としがちなポイントをまとめました。今まさにエラー9に悩む方のお役に立てれば幸いです。

日課マクロ停止、インデックスエラーと解決策

マクロを使い始めた頃、毎朝の集計マクロを作りました。複数のファイルからデータを読み込むシンプルなものです。特定のシートに集約する仕組みになっていました。毎日問題なく動いていたのに、ある朝突然マクロが停止します。「インデックスが有効範囲にありません」と表示されたのです。画面のエラーダイアログを見た瞬間、頭が真っ白になりました。前日まで動いていたのに、なぜ急に止まったのでしょうか。全く見当もつきませんでした。

毎朝回す集計マクロが急にエラー9で止まりました。前日まで動いていたのになぜ、と焦って胃が重くなります。メッセージだけでは原因が分からず、直し方も分かりません。その日の午前中はほぼエラーとにらめっこしていました。結局手作業で集計する羽目になり、落ち込んでしまったのです。

VBA参照エラーの15分特定

このエラーは、VBAが特定のオブジェクトを参照する際に起きます。対象のシートやブックが存在しない場合などによく見られます。例えば「Worksheets(“集計シート”)」と書いたとしましょう。対象シートが見つからないと、VBAは範囲外だと判断します。エラー発生箇所で実行が止まり、VBEのデバッグ画面に切り替わるのです。

VBAエディタでエラーが発生し、特定の行が黄色くハイライトされ、小さなポップアッ

以前はエラー解決に3時間ほどかかることもありました。しかし今はチェックリストのおかげで、15分ほどで見当がつくようになりました。

VBAエラー9、シート名記述ミスが盲点

エラー9に遭遇したとき、私が最初に確認する箇所があります。それはシート名やブック名の記述ミスです。前日まで動いていたマクロが急に止まるケースがありますよね。以前の私は、まさにこのタイプミスが原因で失敗しました。当時の私はマクロが止まったことにとても焦っていました。複雑なコードのロジックばかりに目を向けていたのです。しかし、原因は非常に単純なものでした。シート名を変更したのが直接的な原因です。VBAコード側のシート名を修正し忘れていました。

シート名指定の注意点とエラー

シートを参照する際の記述方法は決まっています。「Worksheets(“シート名”)」のように記述してみてください。この「シート名」が実際のシート名と一文字でも異なると危険です。VBAは存在しないと判断し、エラー9を発生させます。「集計シート」を「集計シト」と打ち間違えていませんか。大文字や小文字を間違えているだけでもエラーになります。Excelのシート名は、VBAでは大文字と小文字が区別される仕様です。そのため、入力には十分な注意を払ってください。

以前、同僚がシート名を変更したことがありました。私は変更を把握しておらず、マクロがエラーで止まります。コードには「データ集計」とあるのにシートが見つかりません。まさか名前が変わっているとは夢にも思いませんでした。原因特定に半日かかり、ずっと冷や汗をかいていました。

VBAエディタのコードウィンドウで、Worksheets(

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

VBA配列インデックス範囲外エラー9の原因と対策

「実行時エラー9」の原因はインデックスの範囲外アクセスです。配列の添字が有効範囲を超えているケースも珍しくありません。VBAには、複数のデータをまとめて扱う「配列」が存在します。「Dim MyArray(10)」と宣言したと仮定しましょう。この場合、11個の要素を持つ配列が作成される仕組みです。この配列の各要素には、番号を使ってアクセスすることになります。0から10までのインデックスを指定してみてください。つまりMyArray(0)が最初の要素と言えるでしょう。そしてMyArray(10)が最後の要素です。

VBAの配列のインデックスは、通常は0から始まります。これは「Option Base 0」がデフォルトだからに他なりません。冒頭で「Option Base 1」と宣言することもあります。その場合、配列のインデックスは1から始まる仕組みです。この「0からか、1からか」の違いには注意してください。

Count-1忘れによる配列エラー解決

配列のデータをループ処理するマクロを作りました。要素数取得時に「Count – 1」をするのを忘れたのです。そのため最後の要素の次のインデックスにアクセスしてしまいます。エラー9が出て「配列の範囲外だ」とすぐにピンときました。しかしどこを直せばいいのかコードを追うのに苦労します。結局終了条件を「UBound(MyArray)」にして解決しました。

VBAエディタのコードウィンドウで、Forループの条件にLBoundとUBoun

実行時エラー9対策:ブックとシート確認

複数のファイルやシートを扱うマクロを作成することがあります。その際、「実行時エラー9」が頻繁に発生しやすい傾向にあります。対象のExcelブックが閉じているケースには注意してください。あるいは参照先シートがブック内に存在しない場合ですね。私は以前、日報ファイルを自動処理するマクロを作りました。その際にも、このエラーにかなり悩まされた記憶があります。実行するたびにエラーが出て、何時間もコードを眺めてしまいます。ファイルが開いていないことが原因だとは思いませんでした。

VBAで他のブック内のシートを参照する方法があります。それには、まずそのブックを開いておく必要があるのです。あるブックを参照する記述をしたと仮定してみましょう。そのブックが開いていなければ、VBAは存在しないと判断します。その結果として、エラー9を発生させてしまうのです。また、ブックが開いていても安心はできません。指定のシートがブック内に存在しなければエラー9が出ます。

マクロエラーとファイル存在チェックの教訓

月次報告書を自動生成するマクロでの出来事です。データブックが事前に開かれていることを前提としていました。ある日同僚がブックを閉じたまま実行しエラーが出ます。私が指示するまで原因が分からず困っていたようです。その姿を見てファイル存在チェックの重要性を痛感しました。それ以来、冒頭でファイルが開いているか確認しています。

VBAエディタのコードウィンドウで、Workbooks(

VBAコレクション:インデックスは1、0はエラー

VBAを触っていると「コレクション」という言葉に出会います。配列と似ているので、私も最初は同じものだと思っていました。Worksheetsなどがその代表例です。複数のオブジェクトをまとめて管理する仕組みですが、配列とはインデックスの扱いが微妙に違います。配列のインデックスは設定によって開始番号が変わりますよね。それに対し、コレクションのインデックスは原則1から始まります。

コレクションは1から!インデックスの罠

この違いを見落とし、0から数えてしまうと危険です。「実行時エラー9」が発生する原因になってしまいます。ブック内の最初のシートを参照したい場合を考えてみましょう。「Worksheets(1)」と記述するのが正しい方法です。これを「Worksheets(0)」と書くとどうなるでしょうか。0番目のシートはないため、エラー9が発生するのです。私もこの違いを理解するまでに少し時間がかかりました。なぜかエラーが出るなと首をひねった経験があります。配列とコレクションを混在させて使うコードもあるでしょう。インデックスの開始位置の違いが混乱を招きやすいポイントです。

コレクションのインデックスは常に1から数え始めます。このルールをしっかりと覚えておきましょう。最後のオブジェクトを参照したい場合があるかもしれません。その際はCountプロパティと組み合わせて使うと便利です。これにより、オブジェクトの総数を取得できる仕様です。

VBAエディタのコードウィンドウで、Worksheets(0)と記述された行がエ

エラー再発の原因、複数箇所と変数確認

エラー9の原因を特定し、修正したとしましょう。なのになぜかまた同じエラーが出ることがあります。以前、シート名のタイプミスを直したことがありました。しかし同じエラーが再発し、非常に戸惑ったのです。その時は、修正箇所が一つだけだと思い込んでいました。しかし実は複数の箇所で同じシート名を参照していたのです。一つだけ直し忘れていたという初歩的なミスでした。このように、エラーが再発する場合は見直すべき点があります。いくつかポイントがあるので順番に見ていきましょう。

まず疑うべきは、同じ間違いが複数箇所に残っていないかです。コード全体で、同じシート名などが何度も参照されているケースはよくあります。一つ直しても、別の場所に同じ問題が残っていれば当然また出てしまいます。そんなときはVBEの検索機能で、原因になりそうな文字列をコード全体から探すのがおすすめです。

ウォッチウィンドウで変数の異常値を確認

次に、変数の値が予期せぬものになっていないか確認します。ステップ実行を使って、エラー直前の変数を確認しましょう。この方法は原因特定に非常に有効な手段です。VBEの「ウォッチウィンドウ」に疑わしい変数を登録してみてください。コード実行とともに値の変化をリアルタイムで確認可能です。変数が空文字や予期せぬ文字列に変わっていませんか。

厄介なエラー9、自己解決のための確認順序

実行時エラー9は、非エンジニアにとって厄介なエラーです。私も何度も悩まされてきましたが、確認する順番さえ決めておけば、ほとんどの場合は自分で解決できます。

まずVBEのデバッグ画面で、黄色くハイライトされた行を見てください。そのうえで①シート名・ブック名のタイプミス②配列のインデックス範囲③開いていないブック・存在しないシートの参照④コレクションは1から始まる、の4点を順に確認します。

この順番で見ていくと、大体は自分で原因にたどり着けています。それでも分からないときは、ステップ実行で変数の値を一つずつ追ってみてください。エラー9に何度もつまずいてきましたが、そのたびに少しずつ、どこを疑えばいいかが分かるようになってきました。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Excel・VBA関連書籍を、手元で見返せる形にしておきたい場合

ExcelやVBAのトラブルは、基本の考え方をあとから見返せるだけでかなり楽になります。手元に1冊置いておくと、同じエラーで止まったときに確認しやすいです。

Excel・VBA関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する