
実行エラー9『インデックスが有効範囲にありません』が発生する原因
実行エラー9『インデックスが有効範囲にありません』のエラーが出る原因は、指定したエクセルファイルの名前やシート名が異なっていた場合や、指定した配列の要素以外の範囲を指定した場合などに発生します
それぞれ、エラーが出るパターンを下記にて解説していきます。
指定したシートが存在しなかった場合
下記のコードの例は、Sheet1というシートのセルA1に「テスト」という文字列を入れています。

下記の図のように、指定したシート名が実際に存在している場合は実行エラー9「インデックスが有効範囲にありません」のエラーは発生しません。
仮に下記図のように、指定したシート名が存在していなかった場合、実行エラー9「インデックスが有効範囲にありません」のエラーは発生してしまいます。
対処方法としては、確実に存在するシート名を指定することが重要です。しかし、ユーザーにシート名を指定してもらったり、シート名が変更されたりする場合には、指定したシート名と一致しないことがあります。
その結果、シート名が一致せず、実行エラー9「インデックスが有効範囲にありません」が発生することがあります。このエラーが出た場合、エラー箇所を特定するのに時間がかかることもあります。
そうならないように、以下のサンプルコードのように、シートを指定する前に、そのシートが本当に存在するかを確認するようにしましょう。もしシートが存在しない場合は、メッセージを表示し、処理を終了させることをおすすめします。
サンプルコード
Sub シート存在確認()
Dim SheetName As String
Dim Ws As Worksheet
Dim AllWs As Worksheet
'使用するシート名を指定します
SheetName = "Sheet1"
'ブック内の全てのシートを繰り返して、指定したシート名と同じシートが存在した場合Wsの変数にシートを格納します
For Each AllWs In ThisWorkbook.Worksheets
If AllWs.Name = SheetName Then
Set Ws = AllWs
Exit For
End If
Next AllWs
'上記の処理でシートが見つからなかった場合、メッセージを出し処理を終了させます(メッセージの内容は、開発するツールに応じて変更してください)
If Ws Is Nothing Then
MsgBox "指定したシートが見つかりませんでした", vbExclamation, "指定シート無し"
Exit Sub
End If
Ws.Range("A1").Value = "テスト"
'リソースの解放を行います
Set Ws = Nothing
End Sub
指定したブックが開かれていなかった場合
シートが存在しなかった場合と同様に、下記のコードのように指定したブックが開かれていなかった場合も実行エラー9「インデックスが有効範囲にありません」が発生します。

下記図のように、ブック(ファイル)が開かれていた場合は、実行エラー9「インデックスが有効範囲にありません」のエラーは発生しません。
下記図のように、ブック(ファイル)が開かれていなかった場合は、実行エラー9「インデックスが有効範囲にありません」のエラーが発生してしまいます。
注意点としては、ブック(ファイル)の名前を指定する際は、拡張子(.xlsx)まで指定するようにしましょう。
シート名の存在確認を行うときと同様に、下記コードのようにメインの処理を行う前に指定したブックが開かれているかを確認することをお勧めします。
サンプルコード
Sub ファイル指定エラー()
Dim BookName As String
Dim Wb As Workbook
Dim AllWb As Workbook
'使用するファイル名を指定します
BookName = "Book1.xlsx"
'現在開いているブックを全て繰り返して、指定したブック(ファイル)名が存在した場合Wbの変数にブックを格納します
For Each AllWb In Workbooks
If AllWb.Name = BookName Then
Set Wb = AllWb
Exit For
End If
Next AllWb
'上記の処理でブックが見つからなかった場合は、メッセージを出し処理を終了させます。(メッセージの内容は、開発するツールに応じて変更してください)
If Wb Is Nothing Then
MsgBox "指定したブックが見つかりませんでした", vbExclamation, "指定ブック無し"
Exit Sub
End If
Wb.Worksheets("Sheet1").Range("A1").Value = "テスト"
'リソースの解放を行います
Set Wb = Nothing
End Sub
配列の要素数を超えたアクセス時のエラーについて
仮に、下記のように配列を宣言して、それぞれの要素に各文字列を格納していたとします。

例えば下記のように、最後に「Debug.Print arr(2)」と出力してもarr(2)は要素数の範囲内の為、実行エラー9「インデックスが有効範囲にありません」のエラーは発生しません。

しかし、要素数を超えて「Debug.Print arr(3)」などと出力しようとすると、実行エラー9「インデックスが有効範囲にありません」のエラーは発生してしまいます。

配列を宣言して、「arr(0) = "テスト1"」などのように直接配列に値を入れる場合は、要素数の管理は自ら行う必要がありますが、動的な配列などはUboundを使用することにより配列の最大要素数が取得できるため、要素数越えのエラー回避が行えます。 下記のサンプルコードがUboundを使用した例です。
サンプルコード
Sub 配列要素数エラー()
'配列を宣言します
Dim arr(2) As Variant
'出力する要素数を指定します
Dim ArrNumber As Long
ArrNumber = 3
'宣言した配列に文字列を格納します。
arr(0) = "テスト1"
arr(1) = "テスト2"
arr(2) = "テスト3"
'指定した要素数が、配列の最大値より大きかった場合はエラーを出す
If ArrNumber > UBound(arr) Then
MsgBox "指定した配列が最大要素数を超えています", vbExclamation, "要素範囲外"
Exit Sub
End If
Debug.Print arr(ArrNumber)
End Sub