変数の宣言と Option Explicit(型の選び方と Integer を避ける理由)
変数の宣言を強制する 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 の既存の名前と同じ変数名は避ける