はじめに
VBAの配列は、Dim myArray(3) のようにサイズだけを指定して宣言すると、インデックス番号が 0 から始まります(0, 1, 2, 3 の4要素)。しかし、プログラミングに慣れていないと、この「0始まり」が直感的でなく、混乱の原因になることがあります。
VBAには、モジュールレベルで「このモジュール内で宣言する配列は、デフォルトで1から始めます」と宣言するための Option Base 1 という特別なステートメントが用意されています。
この記事では、Option Base 1 の基本的な使い方と、その効果が及ばないケースなどの重要な注意点について解説します。
Option Base 1 の使い方と効果
Option Base 1 は、必ずモジュールの最上部(Sub などのプロシージャよりも前)に記述します。
サンプルコード
以下のコードは、Option Base 1 を記述した場合に、配列のインデックスがどのように変化するかを示します。
' モジュールの最上部に記述
Option Base 1
Sub CheckArrayBase()
'--- Dimでサイズのみ指定した配列 ---
' Option Base 1 の影響を受ける
Dim itemList(3) As String
' itemListのインデックス範囲を調べる
Debug.Print "itemList LBound: " & LBound(itemList) ' -> 1
Debug.Print "itemList UBound: " & UBound(itemList) ' -> 3
' 要素数は 3-1+1 = 3個
'--- Array関数で作成した配列 ---
' Option Base 1 の影響を受けない
Dim fruitList As Variant
fruitList = Array("りんご", "みかん", "レモン")
' fruitListのインデックス範囲を調べる
Debug.Print "fruitList LBound: " & LBound(fruitList) ' -> 0
Debug.Print "fruitList UBound: " & UBound(fruitList) ' -> 2
End Sub
Option Base 1 の注意点と限界
Option Base 1 は便利な一方で、全ての配列に影響するわけではありません。この挙動を理解しないまま使うと、逆にバグの原因になります。
1. Array関数には効果がない
サンプルコードで示した通り、Array関数で作成した配列は、Option Base 1 の影響を受けず、常にインデックスが 0 から始まります。これは非常に重要なポイントです。
2. To で範囲を明示した配列には効果がない
Dim myArray(1 To 5) のように、宣言時に To を使ってインデックス範囲を明示的に指定した場合、Option Base 1 は無視され、指定した通りの範囲になります。
' モジュールの最上部に記述
Option Base 1
Sub ExplicitBoundsExample()
'範囲を明示的に 0 To 2 で宣言
Dim data(0 To 2) As String
' Option Base 1 は無視され、宣言通り 0 になる
Debug.Print LBound(data) ' -> 0
End Sub
結論: いつ使うべきか?
Option Base 1 は、Dim myArray(n) という形式の宣言を多用し、かつ 0 始まりのインデックスがどうしても馴染めない場合に、コードの可読性を上げる助けになります。
しかし、Array関数に影響がないことや、To で明示的に指定した方が確実であることから、多くの熟練したプログラマーは Option Base 1 に頼らず、常に Dim 配列名(0 To n) や Dim 配列名(1 To n) のように範囲を明示的に指定する方法を好みます。
まとめ
今回は、配列のデフォルトの開始インデックスを 1 に変更する Option Base 1 について解説しました。
- モジュールの最上部に
Option Base 1と記述すると、そのモジュール内のDim 配列名(n)形式の配列は1始まりになる。 Array関数や、Toで範囲を明示した配列には影響しない。- 混乱を避けるため、
Option Base 1に頼るよりも、Dim 配列名(1 To n)のように常に範囲を明示する方が、より安全で分かりやすいコードになることが多い。
Option Base 1 は便利な機能ですが、その特性と限界をよく理解した上で、利用するかどうかを判断しましょう。
