更新日:、 作成日:

VBA エラー 9 インデックスが有効範囲にありません。

はじめに

Excel VBA マクロのエラー 9 「インデックスが有効範囲にありません。」の対処法を紹介します。

配列やコレクションの存在しないインデックスや名前を指定したときに発生します。

エラーの基本的な対処法は、エラー箇所の特定とその原因となったコードをデバッグします。

デバッグについては「デバッグの仕方」をご覧ください。
エラー処理については「エラー処理をする」をご覧ください。

解決する

配列やコレクションにはインデックスの範囲が決まっています。その範囲を超えるインデックスを指定したときに発生します。

またコレクションに存在しない名前を指定したときも発生します。

インデックスを指定する

配列のインデックスの範囲は「LBound 関数」と「UBound 関数」を使用して、最小値と最大値を取得できます。この範囲を超えるインデックスを指定するとエラーが発生します。

Dim 配列(3) As Integer

Dim min As Integer
min = LBound(配列) ' 0、配列の最小インデックス
Dim max As Integer
max = UBound(配列) ' 3、配列の最大インデックス

' 全要素をループする
Dim i As Integer
For i = min To max ' i の値が 0 ~ 3 まで変化する    
    配列(i) = 10
Next

配列(-1) = 10 ' エラー

Worksheets などの VBA のコレクションのインデックスは 1 から始まります。最大値は Count プロパティで取得できます。この範囲を超えるインデックスを指定するとエラーが発生します。

Dim ws As Worksheet

' 全要素をループする
Dim i As Integer
For i = 1 To Worksheets.Count
    Set ws = Worksheets(1)
Next

Set ws = Worksheets(-1) ' エラー

コレクションのときは For Each を使用するとインデックスを気にすることなく全要素をループできます。

Dim ws As Worksheet

' 全要素をループする
For Each ws In Worksheets
    Debug.Print(ws.Name)
Next

存在する名前を指定する

Worksheets などのコレクションは、名前を指定しても要素を取得できます。存在しない名前を指定するとエラーが発生します。Name プロパティで名前を取得できます。

Dim ws As Worksheet

Set ws = Worksheets("なし")   ' エラー
Set ws = Worksheets("Sheet1") ' 正常
Debug.Print(ws.Name)
sheet1

その名前が存在するか「シートの存在確認をする」などで確認できます。