【Excelマクロ】VBAで[インデックスが有効範囲にありません]と表示される原因と対処法

スポンサードリンク
VBA
過去の自分
過去の自分

VBAで作成したExcelのマクロを実行したら、
「インデックスが有効範囲にありません」っていうエラーが出た…。
これってどうしたらいいの?

今の自分
今の自分

なるほど…。
では今回は、「インデックスが有効範囲にありませんと表示される原因と対処法」
できるだけわかりやすく解説いたします。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

スポンサードリンク

VBAで[インデックスが有効範囲にありません]と表示される原因

インデックスが有効範囲にありません

このエラーは、有効範囲外のインデックスを操作しようとした場合に発生します。
Excelのマクロでは発生しやすいエラーといえます。
ここで言う「インデックス」とは、以下のようなものを指します。

  • 配列の要素
  • シート番号
  • 範囲指定のセル など

要は限られた範囲を超える部分を操作しようとしたということです。
8月32日や、6時75分を指定したといえばわかりやすいでしょうか。

では、具体的に再現してみましょう。
発生しやすい配列を例にします。
下記のVBAコードを見てください。

Sub インデックスが有効範囲にありません()
    Dim arr(1 To 3) As String
    Debug.Print arr(4)
End Sub

2行目で、要素が3つある配列を作成しました(1・2・3の3つ)
しかしながら、3行目で4番目の配列要素を表示させようとしています。
実行してみると、「インデックスが有効範囲にありません」というエラーが発生しました。

インデックスが有効範囲にありません

配列要素は「1~3」で、「4」は存在せず、有効範囲外だからエラーになったということです。

この場合は、(0)を指定しても同じ結果(エラー)になります。

Sub インデックスが有効範囲にありません()
    Dim arr(1 To 3) As String
    Debug.Print arr(0)
End Sub
インデックスが有効範囲にありません

このように、範囲や限度を超えた部分を操作したり指定した場合に、
「インデックスが有効範囲にありません」というエラーが発生することがあります。

「インデックスが有効範囲にありません」と表示される主な原因

  • 作成した範囲を超える配列の要素を操作した
  • 空の配列を操作した
  • 存在しないシートを操作した
  • 範囲選択外のセルを操作した

では、どのように対処したらいいのでしょうか?
次項で対処法を紹介いたします。

スポンサードリンク

VBAで[インデックスが有効範囲にありません]と表示された場合の対処法

主な対処法は以下の2つです。

  • VBAコードを再確認する
  • インデックスがわかる関数を使う

VBAコードを再確認する

原始的ですが、Excelのマクロに限らず基本的な対処法です。
エラーが発生した画面の「デバッグ」をクリックすることで、該当箇所を黄色く色付けして教えてくれます。

エラー画面
デバッグ

該当箇所やそれ以前をよく確認しましょう。
配列やシート番号などが適切に指定されていますか?
ひとまず数値や番号を変えて再実行してみるのも一つの手です。

インデックスがわかる関数を使う

インデックスがわかる関数とは、「Sheets.Count」や「LBound」「UBound」などです。
下記のVBAコードを見てください。

Sub インデックスが有効範囲にありません()
    Dim arr(1 To 3) As String
    Debug.Print arr(UBound(arr))
End Sub

前項でエラーが出たコードとほぼ同じですが、3行目の()内を「UBound(arr)」に変更しただけです。

    Debug.Print arr(4)
        ↓
    Debug.Print arr(UBound(arr))

これでエラーが出なくなります。
「UBound」は配列の上限値を指定する関数で、この場合は上限である(3)を指定したことになります。
「UBound」の詳細は下記記事をご参考ください。

「LBound」で「下限値」を指定できます。

Sub インデックスが有効範囲にありません()
    Dim arr(1 To 3) As String
    Debug.Print arr(LBound(arr)) ' arr(1)を指定
End Sub

【こんな場合に便利!】
配列は通常「0・1・2」など、0から始まる要素番号で作られることが多いです。
要素が3つだからと思って、上限の要素番号が「3」だと勘違いした経験はありませんか?
(実際は2)
Excelのマクロを作成するうえで、1度は経験があるのではないでしょうか。
勘違いしたまま「3」を指定して操作しようとすると、今回のようなエラーが発生します。
「UBound」や「LBound」を使うことで、適切に上限や下限を指定することができます。

スポンサードリンク

最後に

VBAで作成したExcelマクロを実行した際、「インデックスが有効範囲にありません」と表示された場合の原因と対処法を解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました