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

エラー表示

このエラーが発生すると、マクロ起動時(コンパイル時)に次のエラーが表示されます。
実行時エラー '9'

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

エラーの発生理由について

Microsoft公式の解答

Microsoft公式によると次のようにあります。

  • 存在しない配列の要素を参照しました。 添字が使用可能な添字の範囲外であるか、またはこの時点でアプリケーション内で配列に次元が割り当てられていません。配列の 宣言で、配列の上限と下限を確認します。次元が変更された配列を使用する場合は、 UBound 関数および LBound 関数を使用して、配列へのアクセスを調整します。インデックスが 変数として指定されている場合は、変数名のスペルを確認します。
  • 配列を宣言しましたが、要素数を指定していません。たとえば、次のコードではこのエラーが発生します。
  • 少しわかりにくいですね。配列を使用していないのに本エラーが発生する場合もあります。詳しく見てみましょう。

    配列の添え字の指定ミス

    1つ目はMicrosoftの言うとおり、配列の範囲の指定ミスもしくは配列の添え字の指定ミスです。配列の要素の最下限を返すLBound関数や配列の要素の最大値を返すLBound関数を使用してその範囲内に添え字を指定しているか調べましょう。

    'Arr(1) に 1を格納したかった
    Sub TestFunc1()
        Dim Arr(5) As Long
        '「Arr(1) = 1」のつもり
        Arr(10) = 1
    End Sub
    

    開いていないブック名を指定

    開いていないブック名を指定してしまった時も本エラーが発生します。変数で指定している場合は、値をよく見直してみましょう。

    '「book1」のSheet1のセルA1の値を表示したかった
    Sub TestFunc2()
        '「"/book1"」は誤字で「"book1"」が正
        MsgBox Workbooks("/book1").Worksheets("Sheet1").Cells(1, 1)
    End Sub
    

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

    存在しないシート名を指定してしまった時も本エラーが発生します。変数で指定している場合は、値をよく見直してみましょう。シート名に加え、ブックの指定もしている場合は「ブックAにあるシート名をブックBで指定してしまっている」ことが無いかを確認してください。

    '「Sheet1」のセルA1の値を表示したかった
    Sub TestFunc3()
        '「"Sheeet1"」は誤字で「"Sheet1"」が正
        MsgBox Worksheets("Sheeet1").Cells(1, 1)
    End Sub
    

    解決方法は?

    添え字やブック名、シート名を見直してみましょう。ケアレスミスをしてしまっているはずです。

    Point!

    添え字やブック名、シート名を変数にしている場合は、変数の値を確認してみましょう。イミディエイトウィンドウを使用すると楽に確認できます。

    エラーで止まってしまった時に、添え字やブックやシートを見直すことも重要です。ブックやシートを見直すときに画面の更新を停止しているとデバッグしにくいです。停止するプログラムをコメントアウトして、エラーが解消したら、コメントアウトを外して画面の更新を停止させてください。

    このエラーの予防策

    エラーが発生しそうなプログラムは重点的にテストを行いましょう。
    どうしても不安な箇所は、添え字ならUBoundやLBoundで確認をします。ブックは開いているか、シートは存在しているかを確認してから値などの操作をしましょう。ただし、操作のたびにこの確認をしてしまうと処理が遅くなりますので極力重点的なテストで済ませましょう。

    関連リンク

    ページの先頭へ