インデックスが有効範囲にありません。(エラー番号:9)


Sub Sample1()
    Dim i As Long
    For i = 1 To 4
        Cells(i, 1) = Worksheets(i).Name
    Next i
End Sub

これは、よく起こるエラーです。

上のコード、ワークシートが3枚しかない状態で実行すると「インデックスが有効範囲にありません」と怒られます。

そりゃそうです。Worksheets(1)からWorksheets(3)までしかないのに、Worksheets(4)を調べようとしているのですから。30人の生徒がいるクラスで、出席番号31番の生徒を指しているようなものですね。"学校の怪談"じゃないんですから、それで返事される方が怖いです。

インデックスは、コレクションの数だけではありません。次のようなケースでも同じエラーが起こります。

Sub Sample2()
    Dim tmp As Variant, i As Long
    tmp = Split("tanaka,suzuki,yamada", ",")
    For i = 1 To 3
        Cells(i, 1) = tmp(i)
    Next i
End Sub

「"tanaka,suzuki,yamada"」と、カンマで区切られたデータを、Split関数で配列に分割します。その配列は変数tmpに入れました。変数tmp内のデータをセルに書き出すとき、つい上のように「For i = 1 To 3」とやってしまいがちです。だって、配列に入ってる要素は「tanaka」「suzuki」「yamada」の3つですから。

コレクションのインデックスは、Worksheets(1),Worksheets(2)…のように「1」から始まります。しかし、配列のインデックスは、VBAの標準では、「0」から始まります。「tanaka」「suzuki」「yamada」の配列なら

tmp(0) → "tanaka"
tmp(1) → "suzuki"
tmp(2) → "yamada"

となります。

上のSample2でエラーになったのは、For Nextの変数iが「3」のときです。存在しないtmp(3)を呼び出したため、そんなヤツはいない!と怒られたわけです。