
Excel VBAで発生する。実行時エラー9「インデックスが有効範囲にありません」は、配列・ワークシート・コレクションなどに対して、存在しない番号やキーを指定した場合に発生します。
特に、インデックス番号でアクセスする古いVBAコードでは、実行するまでエラーに気づきにくい点が特徴です。
※本記事は、2026年時点のExcel VBA環境でも通用する対処方法をもとに解説しています。
━━━━━━━━━━━━━━━━━━━━━━━━
エラーを原因ごとに
確認できるチェックリストを無料公開しています。
↓↓↓↓↓
▶ すぐに確認する
━━━━━━━━━━━━━━━━━━━━━━━━
実行時エラー9「インデックスが有効範囲にありません」が発生する原因
Excel VBAを使っているときに、「インデックスが有効範囲にありません」というエラーに遭遇したことはありませんか?このエラーは、プログラムが指定したインデックスが存在しない場合に発生します。
このエラーは、VBAがコードを実行した時点で初めて「指定されたインデックスやキーが存在しない」と判断した場合に発生します。
VBAでは、配列のサイズやシート枚数、コレクションの中身は実行時にならないと確定しないケースが多いため、コード自体に文法エラーがなくても、実行時エラー9が発生します。
※英語版のExcel VBAでは、このエラーは「Subscript out of range」と表示されます。
エラーが発生する主な原因
以下のような原因があります。
配列のインデックスが範囲外になっている場合
Dim arr(1 To 3) As Integer
arr(4) = 10 ' エラー: インデックスが有効範囲にありません
ワークシートやワークブック、セル範囲などのコレクションで存在しないインデックスを指定した場合
Sheets(5).Select ' ワークブックに4枚しかシートがない場合、エラー
シートを番号(Sheets(5))で指定する方法は、シートの追加・削除・並び替えによって実行時エラー9が発生しやすくなります。
実務では、番号指定よりもシート名での参照Worksheets("Sheet名"))が安全な書き方とされています。
セル範囲を超えた参照をした場合
Range("A1:A10")(11).Value = "Test" ' A1:A10の範囲外
エラーを解消する基本の対処方法
エラーを防ぐための対処方法は以下の通りです
1.配列の範囲を確認
配列のインデックスが正しい範囲内にあることを確認します。
Dim arr(1 To 3) As Integer
If LBound(arr) <= 4 And UBound(arr) >= 4 Then
arr(4) = 10
Else
MsgBox "インデックスが有効範囲にありません"
End If
2.ワークシートやコレクションのインデックスを確認
ワークシートやコレクションのインデックスが有効範囲内にあることを確認します。
If Sheets.Count >= 5 Then
Sheets(5).Select
Else
MsgBox "指定されたシートは存在しません"
End If
3.セル範囲のインデックスを確認
セル範囲を超えた参照がないか確認します。
Dim rng As Range
Set rng = Range("A1:A10")
If rng.Cells.Count >= 11 Then
rng.Cells(11).Value = "Test"
Else
MsgBox "セル範囲が有効範囲にありません"
End If
・配列の範囲やコレクションの要素数を常に確認することが重要です。
・コード内で動的に範囲やインデックスを扱う場合は、エラーハンドリングを行う。
エラーを防ぐExcel VBAサンプルコード
LBound / UBound を使うことで、配列サイズが変更されてもエラー9を防げます。
Option Explicit
Sub CheckArrayIndex()
Dim arr(1 To 3) As Integer
Dim index As Integer
index = 4
If LBound(arr) <= index And UBound(arr) >= index Then
arr(index) = 10
Else
MsgBox "インデックスが有効範囲にありません"
End If
End Sub
自分の実力を客観的にチェックしたい…。そんな方のために、自分に合った学習スタート地点がわかる無料の選択問題集をご用意しました。(VBAエキスパートベーシック資格試験から抜粋した問題です)
80%ならスタンダード合格レベル、50〜79%はベーシック理解途中、49%以下は基礎理解不足 (※ご安心ください。この問題をされた人の情報は一切残りません。実力のチェックができる問題集で、クリックですぐにスタートではありません。解説の下に問題があります)
ワークシートインデックスのエラー防止
Option Explicit
Sub CheckSheetIndex()
Dim sheetIndex As Integer
sheetIndex = 5
If Sheets.Count >= sheetIndex Then
Sheets(sheetIndex).Select
Else
MsgBox "指定されたシートは存在しません"
End If
End Sub
コレクションで発生するエラーを防ぐ
Option Explicit
Sub CheckDictionary()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "Key1", "Value1"
If dict.Exists("Key2") Then
MsgBox dict("Key2")
Else
MsgBox "Key2は存在しません"
End If
End Sub
よくある古い書き方
Sheets(5).Select
このようなインデックス指定は、シート構成が変わると 実行時エラー9 の原因になります。
Dim ws As Worksheet
On Error Resume Next
Set ws = Sheets("Sheet5")
On Error GoTo 0
If ws Is Nothing Then
MsgBox "指定したシートは存在しません"
Else
ws.Select
End If
番号ではなく「名前」で参照することで、シート構成変更によるエラーを防げます。
実行時エラー9は原因がはっきりしているため、発生パターンごとに対処方法を覚えておくことが重要です。
━━━━━━━━━━━━━━━━━━━━━━━━
次に同じエラーで迷わないように。
↓↓↓↓↓
Excel VBAエラーを順番に切り分ける
チェックリストを無料配布しています。
▶ 次から迷わないために保存する
━━━━━━━━━━━━━━━━━━━━━━━━