本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
VBAでマクロを実行したときに、
「実行時エラー ‘9’:インデックスが有効範囲にありません」
と表示されて止まってしまったことはありませんか?
初心者のころの私は、
シート名を1文字間違えただけでこのエラーを何度も出していました。
「ちゃんとシートはあるのに…なぜ?」
と混乱した経験があります。
実行時エラー9は、
“指定したものが見つからない”ときに発生するエラー です。
この記事では、
-
実行時エラー9の意味
-
よくある原因
-
落ち着いて直すための手順
-
再発を防ぐコツ
を初心者向けにわかりやすく解説します。
VBA 実行時エラー9とは?|「インデックスが有効範囲にありません」の意味
実行時エラー9のエラーメッセージの意味
実行時エラー9の正式なメッセージは次の通りです。
実行時エラー ‘9’
インデックスが有効範囲にありません
英語では
Subscript out of range
と表示されます。
ここでいう「インデックス」とは、
-
シートの番号
-
シート名
-
ブック名
-
配列の番号
など、“指定した位置や名前” のことを指します。
つまり、
「あなたが指定したその番号(名前)は存在しません」
とVBAが教えてくれているのです。
なぜエラー9が発生するのか?仕組みをやさしく解説
VBAでは、シートやブックは
コレクション(一覧)として管理 されています。
たとえば:
Worksheets("Sheet1")
と書いた場合、
VBAは内部で
「このブックにSheet1という名前のシートはあるか?」
と探します。
もし一覧の中に見つからなければ、
→ 実行時エラー9
が発生します。
実行時エラー9は、主に次の3つのケースで起こります。
よくある原因① シート名の入力ミス
実行時エラー9で最も多い原因が、シート名の指定ミスです。
たとえば、次のコード。
Worksheets("売上データ").Select
このとき、
-
実際のシート名が「売上データ2024」だった
-
「売上 データ」と空白が入っていた
-
全角・半角が違っていた
-
最後にスペースが入っていた
このような場合、VBAは一致する名前を見つけられません。
すると、
実行時エラー ‘9’
インデックスが有効範囲にありません
と表示されます。

ポイント
VBAは「だいたい合っている」では動きません。
完全一致が必要です。
初心者のころは、私も
-
コードをコピペ
-
シート名を手入力で修正
-
1文字足りない
…というミスを何度もしました。
対策としては、
シート名はコピーして貼り付けるのが安全です。
よくある原因② 開いていないブックを指定している
次に多いのが、ブック指定のミスです。
Workbooks("集計表.xlsx").Activate
このコードは、
「現在開いているブックの中に“集計表.xlsx”があるか?」
を確認しています。
もしそのファイルが
-
開いていない
-
名前が変更されている
-
拡張子が違う(.xlsm など)
場合、エラー9になります。

実務でありがちなケース
共有フォルダでファイル名が変更された
「最終版」「最新版」などが付け足された
保存形式が変わった
コードの使い回し時にもよく起こります。
よくある原因③ 配列の範囲ミス
少しレベルが上がると、
配列が原因でエラー9が出ることもあります。
例:
Dim arr(1 To 3) As String
arr(4) = "テスト"
この場合、arrは1〜3までしか存在しません。
4番目を指定すると、
→ 実行時エラー9
になります。

配列で起こりやすいミス
-
0始まりと1始まりの混同
-
ReDim忘れ
-
ループ回数の指定ミス
-
UBoundの確認不足
マクロが複雑になるほど、
「今この変数に何が入っているのか?」
が分からなくなり、エラーが出やすくなります。
ここまでが「原因編」です。
次の章からは実行時エラーの修正方法を紹介していきます。
実行時エラー9の直し方|初心者向けチェック手順
ここからは、実際にエラーが出たときの対処法です。
まずは止まった行を確認する(デバッグ方法)
エラーが出ると、VBE(VBA画面)で
黄色くハイライトされた行が表示されます。
その行が、
「VBAが見つけられなかった対象」
です。
慌てずに、まず確認しましょう。
✔ 確認ポイント
-
シート名は正しい?
-
ブック名は正しい?
-
配列番号は範囲内?
F8キーでステップ実行すると、
どこで止まるのかがより分かりやすくなります。
ステップ実行については以下の記事で詳しく紹介しています。
▶マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説
指定している「名前」と実物を照合する
エラー9の解決の基本は、
コードの中の名前と、実際の名前を照合すること
です。
例えばシートなら:
-
実際のシート名をコピー
-
コードに貼り付け
-
不要な空白がないか確認
ブックなら:
-
イミディエイトウィンドウで確認
? Workbooks.Count
なども有効です。

コードの確認や簡単な命令を実行できるイミディエイトウィンドウを表示できます。
ショートカットキーは Ctrl + G です。

現在開いているブックの数などをその場で確認できます。
デバッグや動作確認に便利な機能です。
事前に存在チェックを入れて回避する方法
実行時エラー9を防ぐには、
処理を実行する前に対象のシートが存在するか確認する方法があります。
以下のように「シートが存在するか」を確認する関数を作成し、
シートがある場合のみ処理を実行するようにします。
シート存在確認関数:
Function SheetExists(shtName As String) As Boolean
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name = shtName Then
SheetExists = True
Exit Function
End If
Next ws
SheetExists = False
End Function
この関数は、指定したシート名がブック内に存在するかを確認し、
存在する場合は True、存在しない場合は False を返します。
実際の利用例(エラー回避):
Sub test()
If SheetExists("売上データ") Then
Worksheets("売上データ").Range("A1").Value = 1
Else
MsgBox "シートが見つかりません"
End If
End Sub
- If文の書き方補足|Trueを返す関数の判定方法
-
SheetExists("売上データ")の戻り値は、
True(ある) または False(ない) のどちらかです。If文は、条件がTrueのときに処理を実行するため、
次のように= Trueを書かなくても判定できます。If SheetExists("売上データ") Thenもちろん、次のように書いても動きます。
If SheetExists("売上データ") = True Thenただし、
= Trueは省略したほうが
コードがすっきりして読みやすくなるため
VBAでは省略形がよく使われます。
このように 事前にシートの存在を確認してから処理を実行することで、
-
シート名の変更
-
シートの削除
-
コードの使い回し
などによる 実行時エラー9の発生を防ぐことができます。

別のブックでも使いたい場合は、そのブック側にも同じコードを追加しておく必要があります。
エラー9を無視してもいい?危険な回避方法
初心者がやりがちなのが、
On Error Resume Next
確かに止まりませんが、
-
本当に重要なエラーも見逃す
-
バグの原因になる
-
データ破損の可能性
があるため、安易に使うのはおすすめしません。
実行時エラー91との違い
ここで混同しやすいのが、エラー91です。
-
エラー9 → 指定したものが存在しない
-
エラー91 → オブジェクトが設定されていない
違いについては、こちらの記事で詳しく解説しています。
▶VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説
マクロのエラーでつまずかないために
実行時エラー9は「存在確認」で解決できますが、
そもそもVBAの仕組みやオブジェクトの考え方を理解しておくと、
エラーの発生自体を減らすことができます。
独学でVBAを学びたい方は、
基礎から体系的にまとめたこちらの記事も参考にしてみてください。
VBA 実行時エラー9まとめ|「存在確認」が解決のカギ
実行時エラー9(インデックスが有効範囲にありません)は、
「指定したものが存在しない」 ときに発生するエラーです。
主な原因は次の3つです。
-
シート名・ブック名の入力ミス
-
開いていないファイルを指定している
-
配列の範囲外を指定している
どれも難しいエラーではありません。
エラーが出たときは、
-
止まった行を確認する
-
指定している名前と実物を照合する
-
配列の範囲を確認する
この順番でチェックすれば、ほとんどの場合は解決できます。
マクロが複雑になるほど、
「今どの値が入っているのか」
「指定している対象は本当に存在するのか」
を意識することが大切です。
エラー9は、
丁寧な確認と設計の大切さを教えてくれるエラー とも言えます。
他の実行時エラーについてもあわせて確認しておきましょう。
実行時エラー9のよくある質問(FAQ)
Q1. VBAの実行時エラー9の原因は何ですか?
実行時エラー9は、
指定したシート・ブック・配列などが存在しないとき に発生します。
主な原因は次の通りです。
-
シート名やブック名の入力ミス
-
開いていないブックを指定している
-
配列の範囲外を指定している
コードで指定している名前と、実際の対象が一致しているかを確認することで解決できることが多いです。
Q2. 「インデックスが有効範囲にありません」と表示されるのはなぜですか?
VBAでは、シート・ブック・配列などが
一覧(コレクション)として管理されています。
その一覧の中に、指定した番号や名前が見つからない場合、
「インデックスが有効範囲にありません」
というエラーが表示されます。
つまり、指定している対象が存在しない可能性が高いという意味です。
Q3. VBAの実行時エラー9はどうやって直しますか?
実行時エラー9が表示された場合は、次の手順で確認すると原因を特定しやすくなります。
-
F8キーで1行ずつ実行する(ステップ実行)
-
エラーで停止した行を確認する
-
指定しているシート名・ブック名・配列番号に誤りがないか確認する
VBAでは、存在しないシートや配列を指定するとエラー9が発生します。
落ち着いて、指定している名前と実際の対象が一致しているかを確認しましょう。
Q4. VBAの実行時エラー9を無視することはできますか?
On Error Resume Next を使うことで、エラーを無視することは可能です。
ただし、この方法は
-
本来修正すべきエラーを見逃す
-
不具合の原因になる
可能性があるため、初心者にはおすすめできません。
まずはエラーの原因を確認し、コードを修正する方法が安全です。
Q5. 実行時エラー9と実行時エラー91の違いは何ですか?
2つのエラーは原因が異なります。
-
エラー9
→ 指定した対象が存在しない -
エラー91
→ オブジェクト変数が設定されていない
どちらもVBAでよく発生する実行時エラーです。
原因や対処方法を理解しておくことで、トラブル時に落ち着いて対応できるようになります。
※関連記事は次の章で紹介しています。
【関連記事】
※外部リンク※
- 下付き文字が有効範囲にありません (エラー 9) |Microsoft Learn
- VBAマクロで、参照先を絶対パスに設定すると「インデックスが有効範囲にありません。」とエラーを返す |Microsoft Learn
※参考書籍 (PR)※
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
