Excel VBA 実行時エラー9「インデックスが有効範囲にありません」原因と対処コード

 

Excel VBAで発生する。実行時エラー9「インデックスが有効範囲にありません」は、配列・ワークシート・コレクションなどに対して、存在しない番号やキーを指定した場合に発生します。

特に、インデックス番号でアクセスする古いVBAコードでは、実行するまでエラーに気づきにくい点が特徴です。

 

※本記事は、2026年時点のExcel VBA環境でも通用する対処方法をもとに解説しています。

 

━━━━━━━━━━━━━━━━━━━━━━━━
エラーを原因ごとに
確認できるチェックリストを無料公開しています。
↓↓↓↓↓
すぐに確認する
━━━━━━━━━━━━━━━━━━━━━━━━

 

 

実行時エラー9「インデックスが有効範囲にありません」が発生する原因

Excel VBAを使っているときに、「インデックスが有効範囲にありません」というエラーに遭遇したことはありませんか?このエラーは、プログラムが指定したインデックスが存在しない場合に発生します。


なぜ「インデックスが有効範囲にありません」は実行時に発生するのですか?

このエラーは、VBAがコードを実行した時点で初めて「指定されたインデックスやキーが存在しない」と判断した場合に発生します。

VBAでは、配列のサイズやシート枚数、コレクションの中身は実行時にならないと確定しないケースが多いため、コード自体に文法エラーがなくても、実行時エラー9が発生します。

※英語版のExcel VBAでは、このエラーは「Subscript out of range」と表示されます。


エラーが発生する主な原因

以下のような原因があります。

1.配列の範囲外アクセス

配列のインデックスが範囲外になっている場合

Dim arr(1 To 3) As Integer
arr(4) = 10 ' エラー: インデックスが有効範囲にありません

 

2.コレクションやワークシートの存在しないインデックス指定

ワークシートやワークブック、セル範囲などのコレクションで存在しないインデックスを指定した場合

Sheets(5).Select ' ワークブックに4枚しかシートがない場合、エラー

シートを番号(Sheets(5))で指定する方法は、シートの追加・削除・並び替えによって実行時エラー9が発生しやすくなります。

実務では、番号指定よりもシート名での参照Worksheets("Sheet名"))が安全な書き方とされています。

 

3.セル範囲の無効な参照

セル範囲を超えた参照をした場合

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エキスパートベーシック資格試験から抜粋した問題です)

無料138問でいまの実力をチェック

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エラーを順番に切り分ける
チェックリストを無料配布しています。
次から迷わないために保存する
━━━━━━━━━━━━━━━━━━━━━━━━