Excel/VBA

TOP

『インデックスが有効範囲にありません』実行エラー9の原因と解決方法を徹底解説

「インデックスが有効範囲にありません」とエラーが出たときの画像です

実行エラー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