配列のインデックス(添字)は 0 から始まるのがプログラミングの常道ですが、1 から始まるほうが都合がよい場合があります。
オブジェクトのコレクション、Excelの行列番号やシート範囲を格納した配列など、強制的に1始まりになるものが多いからです。これらに 0始まりの配列を絡めると、常に+1
や-1
を意識しなくてはならないのが厄介です。
配列のインデックスを 1始まりにすると、データ(n)
は 配列(n)
とし、Object.Count
と Ubound(
配列)
を等しくできます。
Option Base 1 でデフォルト変更
と同じくモジュールの先頭に記述します。Option Base 1
ステートメントは、Option Explicit
これは、モジュール内での配列を1始まりにする宣言です。なお、この宣言がない場合は Option Base 0
を宣言したのと同じになります。
Option Explicit
Option Base 1
Sub 配列abc()
Dim aryA, aryB, aryC
ReDim aryA(3)
aryA(1) = "東京"
aryA(2) = "千葉"
aryA(3) = "神奈川"
aryB = Array("東京", "千葉", "神奈川")
aryC = Split("無し/東京/千葉/神奈川", "/")
End Sub
配列宣言でデフォルトの開始インデックスが 1 になる
開始インデックスを省略したときに1
が設定されます。Dim aryA(3)
は、Dim aryA(1 To 3)
の意味になりインデックス 1
~3
の要素を持ちます。
Array 関数の開始インデックスが 1 になる
Array
関数では、値の代入時に開始インデックスを指定できません。必ず Option Base
の指定に従うことになります。
Split関数の開始インデックスは 0 のまま
ここが要注意ポイントです。Option Base 1
を指定しても、Split
関数で作られる配列は0始まりです。
筆者は上記サンプルのように、インデックス0
にはダミーの値を入れて使ったりします。これにより、Split
関数による配列を特別扱いするのを避けることができます。