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


コメント