はじめに
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
は便利な機能ですが、その特性と限界をよく理解した上で、利用するかどうかを判断しましょう。