【VBA】配列のインデックスを常に1から始める Option Base 1 の使い方と注意点

目次

はじめに

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次