VBAを書いていて「変数名を打ち間違えたのにエラーにならない」という経験はありませんか?
原因は、VBAが未宣言の変数を自動的に作ってしまう仕組みにあります。スペルミスに気づけず、バグの特定に何時間もかかることも珍しくありません。
そんなトラブルを防いでくれるのが Option Explicit です。この記事では、VBA Option Explicitの意味・設定方法・実践コードをまとめて紹介します。
NOTE
VBEの起動方法や画面の見方は「VBE画面の見方」で解説しています。
Alt+F11でVBEを起動し、「挿入」→「標準モジュール」でコードを書く準備ができます。
VBA Option Explicitとは?
Option Explicit は、モジュール内のすべての変数に Dim などの宣言を必須にする命令です。
モジュールの先頭(宣言セクション)に1行書くだけでOK。宣言なしの変数があると コンパイルエラー になるので、スペルミスや未宣言の変数を即座に検出できます。
Option Explicit '← モジュールの先頭に書くだけ
Sub SampleMacro()
Dim sName As String '--- 変数を宣言してから使う ---
sName = "田中太郎"
MsgBox sName
End Sub
TIP
Option Explicitはモジュール単位で適用されます。プロジェクト内のすべてのモジュールに記述するか、後述の自動設定を有効にしておきましょう。
Option Explicitがないとどうなる?(スペルミスバグの実例)
「Option Explicitなしでも動くなら、なくていいのでは?」と思うかもしれません。でも実務では、これが原因で見つけにくいバグが発生します。
タイプミスで別変数が作られる
次のコードを見てください。total と書くべきところを totla とタイプミスしています。
Sub CalcWithoutOptionExplicit()
Dim total As Long '--- 合計金額 ---
total = 1000
'--- タイプミスに気づかない ---
totla = totla + 500 '← total ではなく totla
MsgBox "合計: " & total '--- 結果は 1000(500が加算されていない)---
End Sub
このコードを実行すると、エラーは出ません。totla が新しいVariant型変数として自動作成され、total には500が加算されないまま処理が進みます。結果は「合計: 1000」と表示されます。
金額計算でこのバグが混入すると、集計結果が数十万円ずれることもあります。しかもエラーが出ないので、数字を見比べるまで間違いに気づけません。
Option Explicitありなら一瞬で発見
同じコードにOption Explicitを付けると、結果はこう変わります。
Option Explicit
Sub CalcWithOptionExplicit()
Dim total As Long '--- 合計金額 ---
total = 1000
'--- タイプミスに気づかない ---
totla = totla + 500 '← ここでコンパイルエラーが発生
End Sub
F5キーで実行した瞬間、「コンパイル エラー: 変数が定義されていません。」と表示されます。totla がハイライトされるので、スペルミスの場所が一目瞭然です。
Option Explicitなしで起きる3つのトラブル
| トラブル | 具体例 | 影響 |
|---|---|---|
| スペルミスが検出されない | total を totla と書いてもエラーにならない | 値が空のまま処理が進む |
| 型が曖昧になる | すべての変数が Variant 型になる | メモリ消費が増え処理速度が低下する |
| バグの原因特定が困難 | エラーにならないので原因箇所が分からない | デバッグに何時間もかかる |
NOTE
数百行のマクロでこのバグが発生すると、原因の特定に何時間もかかります。Option Explicitを設定しておけば一瞬で見つかりますよ。変数の値をリアルタイムで追跡したいときは「ローカルウィンドウ」も合わせて使うと効率的です。
Option Explicitの基本的な使い方
宣言セクションに記述する
Option Explicitは、モジュールの 一番上(宣言セクション)に記述します。
Option Explicit
Sub SampleMacro()
Dim sName As String '--- 氏名 ---
sName = "田中太郎"
MsgBox sName
End Sub
Option Explicit と Sub の間に区切り線が自動表示されます。宣言セクションとプロシージャの境目です。
動作確認してみよう
宣言した変数名と違う名前を使うとどうなるか、試してみましょう。
Option Explicit
Sub TestWithOptionExplicit()
Dim sName As String '--- 氏名 ---
sName = "田中太郎"
'--- わざとスペルミスをする ---
MsgBox sNaem '← ここでコンパイルエラーが発生
End Sub
このコードをF5キーで実行すると sNaem がハイライトされます。スペルミスを即発見できますね。
比較として、Option Explicitがない場合も見てみましょう。
Sub TestWithoutOptionExplicit()
Dim sName As String '--- 氏名 ---
sName = "田中太郎"
'--- わざとスペルミスをする ---
MsgBox sNaem '← エラーにならず空白のメッセージが表示される
End Sub
こちらはエラーが出ません。空のメッセージボックス が表示されるだけです。sNaem がVariant型変数として自動作成され、値はEmpty(空)になります。
Option Explicitを自動入力する設定方法
毎回手入力するのは手間ですよね。VBEの設定を変更すれば、新規モジュール作成時に自動で入力されるようになります。
VBEのオプションで「変数の宣言を強制する」を有効にする
- VBEのメニューバーから [ツール] → [オプション] を開く
- [編集] タブの「変数の宣言を強制する」にチェックを入れる
- [OK] をクリック
これで、新しくモジュールを挿入するたびに Option Explicit が自動挿入されます。
既存モジュールへの反映
注意点がひとつあります。この設定は 新規モジュールにのみ 適用されます。
設定を有効にする前に作成したモジュールには反映されません。既存モジュールには手動で先頭に Option Explicit を追記してください。
TIP
まだ設定していない方は、この記事を読んでいる今がチャンスです。VBEを開いて [ツール] → [オプション] から設定しておきましょう。
変数の型宣言と組み合わせてVBAの品質を上げる
Option Explicitを設定すると、変数の型を意識する習慣が自然につきます。適切な型を指定すれば、処理速度とメモリ効率が改善しますよ。
よく使う型とメモリ比較
| 型 | メモリ | 用途 | 具体例 |
|---|---|---|---|
| Long | 4バイト | 行番号・カウンター | Dim i As Long |
| String | 文字数に応じて変動 | 文字列データ | Dim sName As String |
| Double | 8バイト | 金額・小数を含む数値 | Dim dTotal As Double |
| Boolean | 2バイト | 真偽値(True/False) | Dim bFlg As Boolean |
| Variant | 16バイト以上 | 型が不確定な場合のみ | Dim vData As Variant |
Variant型は便利ですが、Long型の4倍以上のメモリを消費します。大量データのマクロでは体感できるほど差が出ます。
型宣言を活かした実務コード
Rangeで最終行まで処理するコードを例に見てみましょう。
Option Explicit
Sub SpeedOptimizedMacro()
Dim ws As Worksheet '--- 対象シート ---
Dim i As Long '--- 行カウンター ---
Dim lLastRow As Long '--- 最終行 ---
Dim sResult As String '--- 処理結果 ---
Set ws = ThisWorkbook.Sheets("Sheet1")
lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'--- A列の値を順番に処理する ---
For i = 2 To lLastRow
If ws.Range("A" & i).Value <> "" Then
sResult = sResult & ws.Range("A" & i).Value & vbCrLf
End If
Next i
MsgBox "処理結果:" & vbCrLf & sResult
End Sub
すべての変数に型を指定しているので、スペルミスも型の曖昧さも発生しません。Do Loopを使う場合も同様に、ループ変数を Long で宣言しておくのがおすすめです。
定数(Const)との併用パターン
Option Explicitと合わせて、変更しない値は定数(Const)で宣言するのがおすすめです。
Option Explicit
'--- 定数の宣言 ---
Const START_ROW As Long = 2 '--- データ開始行 ---
Const SHEET_NAME As String = "売上データ" '--- 対象シート名 ---
Sub ProcessSalesData()
Dim ws As Worksheet '--- 対象シート ---
Dim i As Long '--- 行カウンター ---
Dim lLastRow As Long '--- 最終行 ---
Dim dTotal As Double '--- 合計金額 ---
Set ws = ThisWorkbook.Sheets(SHEET_NAME)
lLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'--- 売上金額を集計する ---
For i = START_ROW To lLastRow
dTotal = dTotal + ws.Range("C" & i).Value
Next i
MsgBox SHEET_NAME & "の合計金額: " & Format(dTotal, "#,##0") & "円"
End Sub
定数を使うメリットは2つあります。
- 変更が1か所で済む: シート名や開始行を変えたいとき、定数の値を変えるだけでOK
- 誤って値を変更できない: 定数に値を代入しようとするとコンパイルエラーになる
Option Explicitを使い忘れるパターンと対策
「設定したつもりなのに効いていない」というケースもあります。よくある原因を整理しておきましょう。
| パターン | 原因 | 対策 |
|---|---|---|
| 自動設定「前」に作ったモジュール | 設定は新規モジュールにのみ適用される | 既存モジュールの先頭に手動で追記する |
| ThisWorkbook・Sheet1などのオブジェクトモジュール | 標準モジュール以外は見落としやすい | オブジェクトモジュールにも必ず記述する |
| 他の人が作ったマクロを引き継いだ | 前任者が設定していない | 引き継ぎ時に全モジュールをチェックする |
| UserFormのコードビハインド | フォームモジュールも対象 | UserFormのコード画面の先頭にも追記する |
TIP
プロジェクトエクスプローラーで各モジュールを開き、先頭に
Option Explicitがあるか1つずつ確認するのが確実です。数が多いときは面倒ですが、一度チェックしてしまえば安心ですよ。
よくあるエラーと対処法
Option Explicitを使い始めると、いくつかのエラーに遭遇することがあります。
| エラー | 原因 | 対処法 |
|---|---|---|
| コンパイル エラー: 変数が定義されていません。 | 変数を Dim で宣言していない | Dim 変数名 As 型 で宣言する |
| コンパイル エラー: 変数が定義されていません。(スペルミス) | 宣言した変数名と綴りが違う | ハイライト箇所のスペルを修正する |
| 実行時エラー ’91’ | オブジェクト変数に Set を使わずに代入した | Set ws = ... のように Set を付ける |
| マクロが実行できない | ファイルを .xlsx で保存している | .xlsm(マクロ有効ブック)に変更する |
| マクロが無効です | セキュリティ設定でブロックされている | トラスト センターでマクロを有効化する |
NOTE
「変数が定義されていません。」エラーが出たときは慌てなくて大丈夫です。VBEが原因の変数をハイライトしてくれるので、スペルを確認するか
Dim宣言を追加しましょう。
まとめ
Option Explicitは、VBAの品質を底上げしてくれる設定です。この記事の内容を振り返っておきましょう。
| 項目 | ポイント |
|---|---|
| 基本 | モジュールの先頭に Option Explicit を記述し、変数の宣言を強制する |
| 効果 | 未宣言の変数を使うとコンパイルエラーで即座に教えてくれる |
| 自動設定 | VBEの [ツール] → [オプション] →「変数の宣言を強制する」で自動挿入できる |
| 型宣言 | Dim … As 型 で明示的に宣言し、処理速度とメモリ効率を改善する |
| 定数 | Const と併用して保守性をさらに上げる |
| 注意 | 既存モジュール・オブジェクトモジュール・UserFormにも手動で追記する |
まだ設定していない方は、今すぐVBEを開いて設定してみてください。たった1回の操作でデバッグ時間が大幅に減りますよ。
関連記事
VBAの基礎を固めたい方は、こちらの記事もあわせてどうぞ。
