1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります
その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では見落としを生みやすい環境となる原因でもあります。
本記事では、配列に関する設定のひとつである Option Base が、
なぜ実務でトラブルの原因になりやすいのかを整理します。
なお、Excel VBAにおける
配列の開始インデックス(0数え/1数え)そのものの問題 については、
以下の記事で詳しく触れています。
知らないと怖いExcelVBAの穴3~配列の0数え/1数え問題~。
あわせて参照すると、本記事の内容がより理解しやすくなります。
2. Option Base とは何か
Option Base は、
配列の開始インデックスを変更する設定です。
Option Base 1
この記述を標準モジュールの先頭に書くと、そのモジュール内で宣言された配列は
1から始まるようになります。
Dim arr(3) As Long
-
Option Baseなし →arr(0)~arr(3) -
Option Base1 →arr(1)~arr(3)
Excelは行・列が1始まりのため、「Excelらしくて便利そう」に見えるのが、
この設定の厄介な点です。
3. なぜ実務で危険なのか①
影響範囲が限定的すぎる
Option Base が影響するのは、そのモジュール内で明示的に宣言した配列だけです。
次のものには 一切影響しません。
-
Split関数の戻り値 -
Array()関数 -
Range.Valueで取得した配列 -
他モジュールで宣言された配列
つまり、同じプロジェクト内で0始まりと1始まりの配列が
混在する状態を自ら作る設定です。
4. なぜ実務で危険なのか②
Split やセル配列と噛み合わない
-
Splitの例
Option Base 1
Sub sample()
Dim arr As Variant
arr = Split("A,B,C", ",")
End Sub
この配列は、必ず 0始まりです。
arr(0) ' "A"
Option Base の指定は 完全に無視されます。
- セル範囲取得の例
Sub sample()
Dim arr As Variant
arr = Range("A1:B2").Value
End Sub
この配列は、
-
行:1始まり
-
列:1始まり
の 2次元配列 になります。
これも Option Base とは無関係です。
5. なぜ実務で危険なのか③
一見すると揃っているように見える
Option Base 1 を使うと、
-
自前で宣言した配列 → 1始まり
-
セルから取得した配列 → 1始まり
というケースがあり、「意外と問題ないのでは?」と錯覚しがちです。
しかし実際には、
SplitArray()Collection-
Dictionary
といった 0始まり前提の世界が必ず混ざります。
6. 「LBound があるから大丈夫」は誤解
よく聞く反論がこれです。
「LBound / UBound を使えば問題ない」
しかし現実には、
For i = 1 To UBound(arr)
や
For i = 0 To UBound(arr)
といった 決め打ちループは必ずどこかに残ります。
Option Base は、コードを読む人の前提を壊す設定であり、
レビューや保守のコストを大きく上げます。
7. 可読性低下、エラーの見落としに繋がる
** Option Base 自体は、エラーを出しません。**
しかし、
-
別モジュールのコード
-
他人が書いた処理
-
数か月後の自分の修正
と組み合わさると、見えにくいバグが静かに発生します。
これもまた、「壊れていることに気づきにくい」タイプの不具合です。
8. 代替案①
開始インデックスを明示する
配列宣言時に、開始位置を明示します。
Dim arr(1 To 3) As Long
これなら、
-
Option Base不要 -
モジュールを跨いでも安全
読めば意図が分かる
というメリットがあります。
9. 代替案②
― LBound / UBound を前提に書く
For i = LBound(arr) To UBound(arr)
' 処理
Next i
これは、Option Base を使わない前提で初めて意味を持ちます。
10. なぜ Option Base は存在するのか
Option Base は、
BASIC系言語や表計算文化との親和性から用意された機能です。
しかし現代のVBA実務では、
メリットよりデメリットの方が圧倒的に大きい設定になっています。
11. まとめ
-
Option Baseは配列の開始位置を変える -
影響範囲が中途半端
-
他の配列生成方法と噛み合わない
結論として、
Option Baseは使わない
これが、Excel VBAで配列事故を避けるための
最も確実な選択です。