VBAで変数(dim)は、どこに書く?

VBAを書き始めた頃に必ず迷うのが「Dim ってどこに書くの?」問題。答えはシンプルで、「その変数をどこまで使いたいか(スコープ)」で決まります。この記事では、最短で迷いが消えるように、パターン別に例コード付きで整理します。
Dimの基本:そもそもDimとは何か
Dim は 変数(や配列)を宣言するためのキーワードです。
この宣言で「nameは文字列、ageはLong(整数)として使う」とVBAに伝えます。型を指定しないこともできますが、ミスに気づきにくく、意図しない型変換も起きやすいので、基本は 必ず As 型 を付けるのがおすすめです。
パターン別:Dimはどこに書く?
① プロシージャ内だけで使う(Sub/Function内)→ 先頭に書く
一番多いパターンです。
この場合、i と msg はこのSubの中だけで使えます。他のSubからは見えません。
② 同じモジュール内の複数Subで共有したい → モジュールの先頭(Subの外)
標準モジュール(Module)に次のように書きます。
ここでは Dim ではなく Private / Public を使うのが分かりやすくておすすめです。(モジュール先頭で Dim も書けますが、読み手が「ローカル?」と誤解しやすいです)
③ どのモジュールからでも使いたい(グローバル)→ 標準モジュール先頭でPublic(注意)
これはプロジェクト全体から参照できます。便利ですが、どこからでも書き換えできるので、 バグが追いにくくなりがちです。
おすすめ運用
- まずは
Private(モジュール内共有)で済ませる Publicは「設定値」など必要最小限にする- 命名で
gを付ける(globalの目印)
④ UserForm/クラスで共有したい → UserForm/クラスの先頭(Subの外)
UserForm内の複数イベント(ボタン/初期化など)で共有したいときは、UserFormモジュールの宣言セクションへ。
mCount は そのフォームの中で共有されます。(クラスモジュールでも同じ考え方です)
よくある勘違い:IfやForの中にDimしたら「その中だけ」ではない
他言語だと「ブロックの中だけ有効」がありますが、VBAは基本的にそうなりません。If の中で Dim しても そのSub/Function全体で使えることが多いです。
この「使えてしまう」が事故の元になりやすいので、初心者のうちは特に宣言はSub/Functionの先頭にまとめるのがおすすめです。
実務でおすすめの書き方ルール(読みやすさ優先)
宣言は先頭にまとめる
途中に書くこと自体はできても、読みづらくなりがちです。
型は必ず書く(As~)
Long:行番号、カウント、IDなど(VBAではIntよりLongが安全)String:文字Double:小数Boolean:True/FalseObject:Rangeなどのオブジェクト
Option Explicitは必須:書く場所と設定方法
書く場所:モジュールの一番上
これがあると、宣言していない変数を使った瞬間にエラーになるので、タイポ(例:totla)で地獄を見る確率が激減します。
自動で入れる設定(おすすめ)
VBEで [ツール] → [オプション] →「変数の宣言を強制」 にチェック。新規モジュール作成時に Option Explicit が自動で入ります。
FAQ:よくある疑問
Dimを書かないとどうなる?
Option Explicit がない場合、タイプミスでも新しい変数として勝手に作られることがあります。そのため、Option Explicit を入れるのが正攻法です。
Dimは途中に書いてもいい?
動く場合もありますが、読みづらくなりやすいので、基本は 先頭にまとめるのがおすすめです。
Static / Const はいつ使う?
Const:絶対に変えたくない固定値(税率など)Static:Subが終わっても値を保持したい(カウンタなど)
まとめ:迷ったら「Sub/Functionの先頭」+「Option Explicit」
- まずは Sub/Functionの先頭に
Dimをまとめる - 複数Subで共有なら モジュール先頭で
Private - どこからでも使う
Publicは 必要最小限 Option Explicitは必須

