配列のインデックス(添字)は 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関数による配列を特別扱いするのを避けることができます。
