VBA エラー 9 インデックスが有効範囲にありません。の原因と対処方法

VBAを実行するとVBA エラー 9「インデックスが有効範囲にありません。」を見る機会はありませんか?

VBA エラー 9はVBAエラーの中でも発生頻度の高いエラーとしてランクインされているとか。

そんな中で悩むことは、

・VBA エラー 9「インデックスが有効範囲にありません。」の原因はなに?
・VBA エラー 9「インデックスが有効範囲にありません。」の対処はどうすればよい?

ではないでしょうか?

今回は、
VBA エラー 9「インデックスが有効範囲にありません。」の原因とサクっとできる対処方法について
まとめます!



VBA エラー 9「インデックスが有効範囲にありません。」はどんなエラー?

配列の要素外の指定やコレクションに存在しない

インデックスや名前を指定したときに発生するエラーです。

タカヒロ
タカヒロ
配列要素の指定でよくやってしまいますよね・・・



VBA エラー 9の原因①「配列の最大要素数を超えた要素を指定」

VBA エラー 9「インデックスが有効範囲にありません。」の原因は

配列の最大要素数を超えた要素を指定したからです。

例えば配列の数が3つだったとして、

存在しない4つ目を指定してしまうなどです。

以下はエラー再現のサンプルコードです。

Sub エラーテスト1()
    Dim Hairetsu(3) As String
    Hairetsu(1) = "Aさん"
    Hairetsu(2) = "Bさん"
    Hairetsu(3) = "Cさん"
    MsgBox "4番目は、" & Hairetsu(4) & "です"
End Sub

エラーが表示されますね。

VBA エラー 9の原因①「配列の最大要素数を超えた要素を指定」の対処方法は配列設定時や参照時のループ終了条件を正しく設定する

配列の要素数を超えない範囲で指定する

VBA エラー 9の原因①「配列の最大要素数を超えた要素を指定」の対処方法は

配列の要素数を超えない範囲で指定するようにします。

タカヒロ
タカヒロ
存在しない要素を指定しないようにすればエラーはでることはありませんね。

エラー修正版のサンプルコードです。

Sub エラーテスト1a()
    Dim Hairetsu(3) As String
    Hairetsu(1) = "Aさん"
    Hairetsu(2) = "Bさん"
    Hairetsu(3) = "Cさん"
    MsgBox "3番目は、" & Hairetsu(2) & "です"
End Sub

問題ありませんね!

 
 

UBoundで要素数を取得し制御する

UBoundで要素数を取得し、

Forループで配列数分まわしてデータを取得します。

UBoundは配列の要素数を返す関数です。

機械的に配列の要素数を取得しますので、超えた要素を指定することはありません。

Sub エラーテスト1b()
    Dim Hairetsu(3) As String
    Hairetsu(1) = "Aさん"
    Hairetsu(2) = "Bさん"
    Hairetsu(3) = "Cさん"
    For i = 1 To UBound(Hairetsu)
        Debug.Print i & "番目は、" & Hairetsu(i) & "です"
    Next
End Sub

結果です。

 
 

For Eachで配列の値を取得し制御する

For Eachで配列の要素値を取得します。

タカヒロ
タカヒロ
配列の要素分繰り返し処理してくれるのでForで回数を指定するより確実ですね。

なお、0番目から開始されますので、ご注意ください。

Sub エラーテスト1c()
    Dim Hairetsu(3) As String
    Dim temp
    Hairetsu(0) = "Aさん"
    Hairetsu(1) = "Bさん"
    Hairetsu(2) = "Cさん"
    Hairetsu(3) = "Dさん"
    For Each temp In Hairetsu
        Debug.Print temp & "です"
    Next
End Sub

結果です。

 
 


VBA エラー 9の原因②「存在しないブック名やシート名を指定」

VBA エラー 9「インデックスが有効範囲にありません。」の原因は

存在しないブック名やシート名を指定したためとなります。

以下はエラー再現のサンプルコードです。



存在しないシート名を指定

Sub エラーテスト2a()
    Dim objSheet As Worksheet
    Set objSheet = Worksheets("存在しないシート名")
End Sub

タカヒロ
タカヒロ
シート名は打ち間違いが多いでしょうか。全角半角など気を付けたいですね。

存在しないブック名を指定

Sub エラーテスト2b()
    Dim objWB As Workbook
    Set objWB = Workbooks("存在しないブック名")
End Sub

特にブック名指定でオブジェクトをセットする時には対象ブックを開いている必要がありますが、
その対象ブックを誤って閉じていまったりすると同様のエラーが発生するので気を付けたいですね。

2パターンともエラーが表示されました。



VBA エラー 9の原因②「存在しないブック名やシート名を指定」の対処方法は存在するブック名、シート名を設定する

VBA エラー 9の原因②「存在しないブック名やシート名を指定」の対処方法は

存在するブック名、シート名を設定するようにしましょう。

タカヒロ
タカヒロ
ブックオブジェクトをセットしている場合は対象ブックを閉じないようにしましょう。

 
 


さいごに

今回は、
VBA エラー 9「インデックスが有効範囲にありません。」の原因とサクっとできる対処方法について
まとめました。

VBAのエラーはパターンを知っておくと発生した時に慌てず対応することができますので、

しっかりと対処方法を把握するようにしておきたいですね!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です