変数宣言ってそもそも何?
まず一番やさしく言うと、変数は「データを入れておく“名前付きの箱”」です。
そして 変数宣言 は、その箱を「これからこういう用途で使います」と VBA に正式に伝える行為です。
人間側の感覚で言えば、
- 「このマクロの中で『合計』という名前の箱を使うよ」
- 「この箱には“数値”だけを入れるつもりだよ」
と、あらかじめ宣言しておくイメージです。
VBA にとっては、
- どんな名前の変数があるのか
- その変数にはどんな種類の値が入るのか(数値?文字?日付?)
を知るための、とても重要な情報になります。
ここを丁寧に押さえておくと、後で出てくる「型」「スコープ」「Option Explicit」なども一気につながります。
変数宣言の基本形(Dim の書き方)
Dim の基本構文
VBA で変数を宣言するときは、必ず Dim から始めます。
基本形はこれです。
Dim 変数名 As データ型
VB例えば、次のように書きます。
Dim count As Long
Dim message As String
Dim price As Double
VBそれぞれ、
- count という名前の「整数用の箱」
- message という名前の「文字列用の箱」
- price という名前の「小数を扱える箱」
を用意している、という意味になります。
宣言した変数に値を入れて使う流れ
宣言しただけでは、まだ中身は「初期値」の状態です。
値を入れるには、= を使って代入します。
Sub Sample()
Dim count As Long
Dim message As String
count = 10
message = "こんにちは"
MsgBox "count は " & count & " です"
MsgBox message
End Sub
VBここでの流れは、
- 箱(変数)を宣言する
- 箱に値を入れる
- その値を使って処理をする
という、とてもシンプルなものです。
この「箱を用意してから使う」という感覚が、変数宣言の出発点です。
なぜ「宣言」がそんなに大事なのか
1つ目の理由:VBA に「型」を教えるため
Dim count As Long と書くことで、VBA は
- count という名前の変数がある
- それは Long 型(整数)として扱う
と理解します。
これによって、
- 小数を代入しようとするときに「おかしいよ」と気づいてくれる
- 文字列を代入しようとするときにエラーになってくれる
つまり、「変な値が入るのを防ぐフィルター」として働いてくれます。
逆に、型を宣言しないと、VBA は「とりあえず何でも入る箱(Variant)」として扱います。
一見便利ですが、後で「思っていた型と違う」バグを生みやすくなります。
2つ目の理由:スペルミスを検出するため(Option Explicit とセット)
Option Explicit を使うと、「宣言していない変数は使えない」というルールになります。
このとき、変数宣言をきちんとしておくと、
- 変数名を打ち間違えたときにコンパイルエラーで止まる
という大きなメリットが生まれます。
例えば、本当は totalAmount と書きたかったのに、totlaAmount と打ち間違えたとします。
宣言していない名前なので、「定義されていません」と怒ってくれます。
宣言をサボると、VBA は「新しい変数が出てきた」と勝手に解釈してしまい、
気づかないままバグが潜り込む、という最悪のパターンになります。
「変数宣言をする」というのは、
“自分のミスをコンパイル時に見つけてもらうための保険”
でもあります。
よく使うデータ型と宣言の具体例
数値系の代表例
Dim count As Long ' 大きめの整数
Dim age As Integer ' 小さめの整数(あまり使わなくてOK)
Dim price As Double ' 小数を扱う
VB超初心者のうちは、「整数はとりあえず Long」「小数は Double」と覚えてしまって構いません。
Integer は範囲が狭く、あまりメリットがないので、最初は Long だけで十分です。
文字列・日付・真偽値
Dim name As String ' 文字列
Dim birthday As Date ' 日付・時刻
Dim isActive As Boolean ' True / False
VB- String は文字列全般
- Date は日付や時刻(内部的には数値ですが、日付として扱える)
- Boolean は「はい/いいえ」「真/偽」を表すフラグ
条件分岐(If)と組み合わせるときに、Boolean はとてもよく使います。
オブジェクト型(Range など)
Dim rng As Range
Set rng = Range("A1")
VBオブジェクト型の変数は、Set を使って代入するのがポイントです。
ここでは詳しくは踏み込みませんが、「Range という“セル範囲オブジェクト”を入れる箱」として宣言しています。
オブジェクト型の変数宣言は、
「この変数は“値”ではなく“何かのオブジェクト”を指すんだな」
という意識を持つきっかけにもなります。
変数宣言の書き方でつまずきやすいポイント
1行に複数書くときの落とし穴
次の2つを比べてみてください。
Dim a, b, c As Long
VBDim a As Long, b As Long, c As Long
VB上の書き方だと、
- a は Variant
- b は Variant
- c だけが Long
という、ちょっと罠っぽい挙動になります。
「最後の変数にしか型がつかない」のが VBA の仕様です。
下の書き方なら、a / b / c すべてが Long になります。
超初心者のうちは、
「1行に1変数」か、「必ず全部に As 型 を付ける」
と決めてしまうのがおすすめです。
宣言の位置:基本は「使うプロシージャの先頭」
最初のうちは、変数宣言は
Sub Sample()
Dim count As Long
Dim message As String
' ここから下で変数を使う
End Sub
VBのように、「その Sub / Function の一番上」に書く、と決めてしまってOKです。
スコープ(有効範囲)の話と絡んできますが、
「まずは、そのプロシージャの中だけで完結する変数」として宣言するのが、いちばん安全で分かりやすいスタートです。
例題:変数宣言をしない場合との違いを体感する
宣言なしで書いた場合(悪い例)
Sub NoDeclare()
total = 10
toatl = total + 5 ' スペルミス
MsgBox toatl
End Sub
VBOption Explicit がない状態だと、VBA は
- total という変数(Variant)を勝手に作る
- toatl という別の変数(Variant)も勝手に作る
という解釈をします。
結果として、
- total には 10 が入る
- toatl には「初期値 0 + 5」で 5 が入る
MsgBox には 5 が表示されますが、
書いた本人は「15 になるはず」と思っているかもしれません。
しかも、エラーは出ません。
これが一番怖いパターンです。
宣言あり+Option Explicit の場合(良い例)
Option Explicit
Sub WithDeclare()
Dim total As Long
total = 10
toatl = total + 5 ' ここでコンパイルエラー
MsgBox toatl
End Sub
VBこの場合、toatl の行で「定義されていません」とコンパイルエラーになります。
「変数宣言をしていない名前が出てきた」と、VBA が教えてくれるわけです。
ここで初めて、「あ、スペルミスしてた」と気づけます。
この違いを一度体感すると、
「変数宣言は、未来の自分を守るための仕組みだ」
という感覚が、かなりリアルになります。
超初心者向け「変数宣言」の実践ルール
最後に、今の段階で意識しておくとかなり楽になるルールをまとめます。
- すべてのモジュールの先頭に
Option Explicitを書く - 変数は必ず
Dim 変数名 As 型で宣言してから使う - 型は「整数なら Long」「小数なら Double」「文字列なら String」くらいから始めれば十分
- 1行に複数書くときは、必ずそれぞれに
As 型を付ける - 宣言は、その変数を使う Sub / Function の先頭にまとめて書く
このあたりを“自分ルール”として固定してしまうと、
変数まわりのバグで悩む時間が一気に減ります。

