変数の宣言と Option Explicit(型の選び方と Integer を避ける理由)

公開日:2026年10月7日 執筆:Takuya カテゴリ:基本・高速化

変数の宣言を強制する Option Explicit の設定方法と効果、Long・String・Date・Variant・Object などの型の選び方、Integer を使わない方がよい理由を実務の例で解説します。

どんな場面で役に立つか

先輩から引き継いだマクロが「なぜか合計が 0 になる」「特定の日だけ結果がおかしい」という相談を受けて調べてみると、原因が変数名の打ち間違いだった、ということは珍しくありません。VBA は初期設定のままだと、宣言していない変数名を書いてもエラーにならず、その場で新しい空の変数として扱ってしまうためです。

Option Explicit をモジュールの先頭に書いておくと、宣言していない変数を使った時点でコンパイルエラーになり、実行前に間違いに気づけます。小さな一行ですが、保守しやすいマクロを書くための最初の習慣です。

Option Explicit の書き方と自動挿入の設定

標準モジュールやシートモジュールの一番上(Sub より前)に Option Explicit と書きます。毎回手で書くのは忘れやすいので、VBE(Visual Basic Editor)のメニュー「ツール」→「オプション」→「編集」タブで「変数の宣言を強制する」にチェックを入れておくと、以後新しく作るモジュールに自動で入ります。既存のモジュールには自動では追加されないため、手で書き足してください。

次の例では、合計用の変数 total を途中で totl と打ち間違えています。Option Explicit がなければエラーにならず、合計が常に 0 のまま表示されますが、あれば実行前に「変数が定義されていません」と表示され、該当箇所が選択されます。

Option Explicit

Sub SumAmount()
    Dim ws As Worksheet
    Dim lastRow As Long, i As Long
    Dim total As Currency

    Set ws = ThisWorkbook.Worksheets("明細")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        If IsNumeric(ws.Cells(i, "E").Value) Then
            totl = total + ws.Cells(i, "E").Value   ' 打ち間違い:ここでコンパイルエラーになる
        End If
    Next i
    MsgBox "合計:" & Format(total, "#,##0")
End Sub

実務でよく使う型の選び方

宣言するときは、入れる値に合った型を指定します。型を書かずに Dim x とだけ書くと Variant 型になり、何でも入る代わりに、間違った値が入っても気づきにくくなります。迷ったときは次の目安で選ぶと大きく外れません。

  • Long:行番号・件数・ループのカウンタなど整数全般(約 ±21億まで)
  • Currency:金額。小数点以下4桁までを誤差なく扱える
  • Double:割合や単価など小数を含む計算値
  • String:取引先名・コードなどの文字列。先頭の 0 を残したいコードも String にする
  • Date:日付・時刻。比較や加算をするなら文字列ではなく Date で持つ
  • Variant:Range.Value で読み込む配列、空白やエラー値が入りうるセルの値
  • Object/Worksheet/Range など:シートやセル範囲。代入には Set が必要

Integer を避ける理由

Integer 型は -32,768 から 32,767 までしか扱えません。昔の解説記事では行番号に Integer を使う例をよく見かけますが、現在の Excel は 100 万行以上を扱えるため、データが 32,767 行を超えた日に「オーバーフローしました(実行時エラー 6)」で止まります。テストでは少ないデータで動くため、本番運用に入ってから発覚しやすいのが厄介な点です。

また、現在の 32 ビット・64 ビット環境では、Integer にしてもメモリや速度の面で目立った得はありません。整数は基本的にすべて Long で宣言する、と決めておくのが安全です。

宣言でつまずきやすい点

1行で複数の変数を宣言するときは、変数ごとに型を書く必要があります。Dim a, b As Long と書くと、Long になるのは b だけで、a は Variant になります。見た目では分かりにくいため、Dim a As Long, b As Long のように一つずつ型を書いてください。

また、Worksheet や Range などのオブジェクト型の変数に代入するときは Set が必要です。Set を付け忘れると「オブジェクト変数または With ブロック変数が設定されていません(実行時エラー 91)」などのエラーになります。変数名には、Excel の既存の名前(Range・Cells・Name など)と同じ名前を使わず、lastRow や wsSrc のように役割が分かる名前を付けると、読み返したときにも迷いません。

  • Dim a, b As Long では a が Variant になる
  • オブジェクトの代入には Set を付ける
  • Excel の既存の名前と同じ変数名は避ける

ほかの記事