〖ExcelVBA・マクロ〗実行時エラー9「インデックスが有効範囲にありません」の原因と対処法まとめ

ExcelVBA

ExcelVBAでマクロを実行したとき、次のエラーが出て止まったことはありませんか?

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

このエラーは、VBA初心者が必ずと言っていいほど遭遇する代表的なエラーです。
しかも原因が1つではないため、「どこが悪いのか分からない…」となりがちです。

この記事では、実行時エラー9が出る代表的な原因と、その対処法を 実務でよくある例に絞って分かりやすく解説します。


スポンサーリンク
スポンサーリンク

実行時エラー9とは?

実行時エラー9は、簡単に言うと次の意味です。

「指定した番号・名前・位置のものが存在しない」

VBAが次のように思っている状態です。

  • 「そのシート、存在しないけど…?」
  • 「その番号の配列要素、無いよ?」
  • 「そのインデックス、範囲外だよ?」

つまり、存在しないものを指定したときに発生します。


原因①:存在しないシート名を指定している(最も多い)

よくあるNG例

Worksheets("集計表").Range("A1").Value = 1

実際のシート名が「集計」なのに、「集計表」と指定していると、 この時点で 実行時エラー9 になります。

対処法

  • シート名の全角・半角を確認する
  • 余分なスペースが入っていないか確認する
  • 存在チェックをしてから使う

安全な書き方(おすすめ)

If SheetExists("集計") Then
    Worksheets("集計").Range("A1").Value = 1
End If
Function SheetExists(sheetName As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo 0
    SheetExists = Not ws Is Nothing
End Function

原因②:Worksheets(番号) の指定ミス

よくあるNG例

Set ws = Worksheets(0)

Worksheets の番号は 1から始まります
0 を指定すると、必ずエラー9になります。

対処法

Set ws = Worksheets(1)

また、シートの順番が変わると意図しないシートを指すことがあるため、 番号指定はなるべく避けて、名前指定がおすすめです。


原因③:配列の範囲外を指定している

よくあるNG例

Dim arr As Variant
arr = Split("A,B,C", ",")

MsgBox arr(3)

配列の中身は

  • arr(0) = A
  • arr(1) = B
  • arr(2) = C

なのに arr(3) を指定すると、存在しないためエラー9になります。

対処法

Dim i As Long
For i = LBound(arr) To UBound(arr)
    MsgBox arr(i)
Next i

LBound / UBound を使うことで、範囲外アクセスを防げます。


原因④:Collection / Dictionary の存在しないキーを指定している

CollectionのNG例

Dim col As Collection
Set col = New Collection

col.Add "りんご", "A"

MsgBox col("B")

キー「B」は存在しないため、エラー9になります。

対処法(Collection)

On Error Resume Next
MsgBox col("B")
On Error GoTo 0

Dictionaryの場合(安全)

If dict.Exists("B") Then
    MsgBox dict("B")
End If

原因⑤:Findで見つからなかったのに使っている

よくあるNG例

Set c = Range("A:A").Find("東京")
MsgBox c.Row

Findで見つからなかった場合、c は Nothing になります。 そのまま使うと、エラー9や91の原因になります。

対処法

Set c = Range("A:A").Find("東京")

If Not c Is Nothing Then
    MsgBox c.Row
End If

実行時エラー9を防ぐためのチェックリスト

  • 指定しているシート名は本当に存在するか
  • 配列・コレクションの範囲外を指定していないか
  • LBound / UBound を使っているか
  • Findの結果が Nothing ではないか
  • 番号指定(0など)をしていないか

まとめ:エラー9は「存在チェック」でほぼ防げる

実行時エラー9は、存在しないものを指定したときに発生します。

逆に言えば、

  • 存在チェックをする
  • 範囲を動的に取得する
  • 決め打ちの番号・名前を減らす

これだけで、ほとんど防げます。

VBAに慣れてきたら、「エラーが出ないコードを書く」ことを意識してみてください。
それだけで、マクロの安定性が一段上がります。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

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