1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

知らないと怖いExcelVBAの穴8 ~便利そうに見えて危ない設定(Option Base)~

1
Last updated at Posted at 2026-01-07

1. はじめに

Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります
その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では見落としを生みやすい環境となる原因でもあります。

本記事では、配列に関する設定のひとつである Option Base が、
なぜ実務でトラブルの原因になりやすいのかを整理します。

なお、Excel VBAにおける
配列の開始インデックス(0数え/1数え)そのものの問題 については、
以下の記事で詳しく触れています。
知らないと怖いExcelVBAの穴3~配列の0数え/1数え問題~
あわせて参照すると、本記事の内容がより理解しやすくなります。

2. Option Base とは何か

Option Base は、
配列の開始インデックスを変更する設定です。

VBA
Option Base 1

この記述を標準モジュールの先頭に書くと、そのモジュール内で宣言された配列は
1から始まるようになります。

VBA
Dim arr(3) As Long
  • Option Base なし → arr(0)arr(3)

  • Option Base 1 → arr(1)arr(3)

Excelは行・列が1始まりのため、「Excelらしくて便利そう」に見えるのが、
この設定の厄介な点です。

3. なぜ実務で危険なのか①

影響範囲が限定的すぎる
Option Base が影響するのは、そのモジュール内で明示的に宣言した配列だけです。

次のものには 一切影響しません。

  • Split 関数の戻り値

  • Array() 関数

  • Range.Value で取得した配列

  • 他モジュールで宣言された配列

つまり、同じプロジェクト内で0始まりと1始まりの配列が
混在する状態を自ら作る設定です。

4. なぜ実務で危険なのか②

Split やセル配列と噛み合わない

  • Split の例
VBA
Option Base 1
Sub sample()

    Dim arr As Variant
    arr = Split("A,B,C", ",")

End Sub

この配列は、必ず 0始まりです。

VBA
arr(0)   ' "A"

Option Base の指定は 完全に無視されます。

  • セル範囲取得の例
VBA
Sub sample()

    Dim arr As Variant
    arr = Range("A1:B2").Value

End Sub

この配列は、

  • 行:1始まり

  • 列:1始まり

2次元配列 になります。

これも Option Base とは無関係です。

5. なぜ実務で危険なのか③

一見すると揃っているように見える

Option Base 1 を使うと、

  • 自前で宣言した配列 → 1始まり

  • セルから取得した配列 → 1始まり

というケースがあり、「意外と問題ないのでは?」と錯覚しがちです。

しかし実際には、

  • Split
  • Array()
  • Collection
  • Dictionary
    といった 0始まり前提の世界が必ず混ざります。

6. 「LBound があるから大丈夫」は誤解

よく聞く反論がこれです。

LBound / UBound を使えば問題ない」

しかし現実には、

VBA
For i = 1 To UBound(arr)

VBA
For i = 0 To UBound(arr)

といった 決め打ちループは必ずどこかに残ります。

Option Base は、コードを読む人の前提を壊す設定であり、
レビューや保守のコストを大きく上げます。

7. 可読性低下、エラーの見落としに繋がる

** Option Base 自体は、エラーを出しません。**

しかし、

  • 別モジュールのコード

  • 他人が書いた処理

  • 数か月後の自分の修正

と組み合わさると、見えにくいバグが静かに発生します。

これもまた、「壊れていることに気づきにくい」タイプの不具合です。

8. 代替案①

開始インデックスを明示する

配列宣言時に、開始位置を明示します。

VBA
Dim arr(1 To 3) As Long

これなら、

  • Option Base 不要

  • モジュールを跨いでも安全

読めば意図が分かる

というメリットがあります。

9. 代替案②

LBound / UBound を前提に書く

VBA
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で配列事故を避けるための
最も確実な選択です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?