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)を呼び出したため、そんなヤツはいない!と怒られたわけです。