【VBAスタンダード対策】配列の要素数「カッコの中の数字」の正体を攻略!
配列を Dim XX(3) と宣言したとき、使える箱は3つだと思っていませんか? 実はVBAの標準的な構造では、指定した数字は「最大インデックス(添字)」を意味します。ここにある「+1」の法則を正しく理解しましょう。
1. 問題:Dim XX(3) で作成される要素の範囲
【 問題 】 Dim XX(3) As Integer と宣言した場合、この配列で使用可能な要素(インデックス)の組み合わせとして正しいものはどれでしょうか?(※Option Baseなどの特殊な設定はしていないものとします)
① XX(1), XX(2), XX(3) の計3つ
② XX(0), XX(1), XX(2) の計3つ
③ XX(0), XX(1), XX(2), XX(3) の計4つ
④ XX(0), XX(1), XX(2), XX(3), XX(4) の計5つ
2. 正解:配列の要素範囲に関する正解
正解: ③ XX(0), XX(1), XX(2), XX(3) の計4つ
3. 解説:カッコ内の数字は「上限値」を指す
VBAの配列宣言 Dim XX(n) において、カッコ内の数字 n は要素数ではなく、使用可能な最大インデックスを構造的に指定しています。
Dim XX(3) と書いた場合:
箱 [0] : XX(0)
箱 [1] : XX(1)
箱 [2] : XX(2)
箱 [3] : XX(3) <-- ここまで使える!
結果として、全部で 4つ の要素が作られます。
[ なぜ勘違いが起きるのか? ]
★ 他の言語との違い:Java 17やC言語では
int a[3] は「3つの要素(0, 1, 2)」を作りますが、VBAは「上限が3(0, 1, 2, 3)」を作るという独自の構造を持っています。★ 1から始めたい場合:もし
XX(1) から XX(3) の3つだけを使いたいなら、構造的に Dim XX(1 To 3) と宣言するのが「理系NEO」な安全な書き方です。1. ここが試験に出る!: 試験では For i = 0 To UBound(XX) のようなループが出た際、要素がいくつあるかを正確にカウントできるかが問われます。UBound 関数は上限値(この場合は3)を返すため、ループは4回回ることになります。
2. エンジニアの視点: 「0番目を使うか使わないか」はVBA開発者の永遠のテーマですが、配列のサイズを求める際は 上限 - 下限 + 1 という計算式が常に成立します。この「+1」を忘れないことが、インデックス範囲外エラー(Runtime Error 9)を防ぐための鉄則です。
4. まとめ
「カッコの中の数字は、最後に使える番号」。この構造を理解していれば、配列の要素数を数え間違えることはありません。細胞分裂の回数と細胞の数が n+1 になる関係のように、VBAの配列もまた、指定した番号までの道筋の中に、常に「0」という原点を含んでいるのです。