【VBA入門】変数と定数の使い方を徹底解説
VBAでマクロを書きはじめると、ボチボチ嫌でも出会うのが変数と定数です
この2つは、計算した値や設定をいったん入れておく「箱」のような存在で、ここを押さえておくとコードの読みやすさが一気に変わります
この記事では、変数と定数の書き方からデータ型・スコープ・命名規則・Constまで、初心者の方がつまずきやすいところを実例つきでまとめました
そもそもVBAの変数とは?基礎から押さえる
結論から言うと、変数は中身を入れ替えられる箱です
数値や文字を一度しまっておいて、あとから取り出したり書き換えたりできます
変数とは「中身が変わる箱」
イメージとしては、Excelのセルが近いです
セルA1に数値を入れて、あとで別の数値で上書きできるのと同じで、変数も値を入れたり入れ替えたりできる入れ物だと思ってください
たとえば合計金額を計算するなら、計算結果をいったん変数にしまっておいて、あとで表示したりセルに書き戻したりします
セルに直接書き込み続けるより、いったん変数を経由したほうがコードが追いやすくなります
ジャベ雄最初は「ラベルを貼った箱」くらいの感覚でOKです
変数を使う3つのメリット
なぜわざわざ変数を使うのか、メリットは大きく3つあります
- 処理効率が上がる … 一度計算した値を使い回せるので、同じ計算を何度も書かずに済みます
- 保守しやすい … 値を1か所にまとめておけば、後から直すときもその変数だけ見ればよくなります
- 読みやすい … targetRow のように意味のある名前を付けると、コードが何をしているか一目で伝わります
とくに最後の「読みやすさ」は、あとからじわじわ効いてきます
セルの座標を数字で直書きすると後から見て意味が分からなくなりますが、名前のある変数なら自分にもチームにもやさしいコードになります
変数の書き方(Dimで宣言する)
変数を使う前に「これから使いますよ」と宣言します
基本の形は Dim 変数名 As データ型 です
Dim score As Integer
Dim name As StringDim は「宣言する」を意味するキーワード、その後ろに自分で決めた変数名、As の後ろにデータ型を書きます
上の例だと、score という整数の箱と、name という文字の箱を用意した、と読めます
データ型は「この箱には何を入れるか」を決める指定です
整数なら Integer、文字なら String といった具合で、種類は後ほどまとめて紹介します
Option Explicitで宣言を強制する
ここが入門者にとって一番の押しどころです
モジュールの先頭に Option Explicit と書いておくと、宣言していない変数を使った瞬間にエラーで教えてくれます
何がうれしいかというと、変数名のタイプミスをコンパイル時に弾いてくれるところです
たとえば targetRow と書くつもりが targetRwo と打ち間違えても、Option Explicit があれば「そんな変数は宣言されてないよ」と止めてくれます
これが無いと、打ち間違えた名前が新しい空っぽの変数として勝手に作られてしまいます
計算が合わないのに原因が分からない、やっかいなバグの温床です
Option Explicit はモジュールの先頭(どのプロシージャよりも前)に1行書くだけです
毎回手で書くのが面倒なら、VBEの「ツール → オプション → エディター」タブにある変数の宣言を強制するにチェックを入れておく方法もあります
これから作る新しいモジュールに自動で Option Explicit が入るので、書き忘れそのものを防げます
この設定はあまり知られていませんが、宣言忘れのケアレスミスがまとめて減るので、最初に済ませておくと安心です



私はこれを入れてから、typoバグでハマる回数がぐっと減りました
変数の命名規則(VBA公式ルールと慣習)
変数名は自由に付けられますが、いくつか守るべきルールと、守ると読みやすくなる慣習があります
ここを分けて理解しておくと、名付けで迷いにくくなります
公式の命名ルール
まず、VBAの仕様として決まっている制約はこちらです
- 先頭は文字(アルファベットや日本語)で始める、数字や記号からは始められません
- スペースや一部の記号(.(ピリオド)! @ & $ #)は使えません
- 長さは255文字以内に収めます
- VBAの関数名やステートメント名と同じ名前(予約語)は避けます
衝突するので別の名前にします
予約語については「使えない」より「避ける」が正確です
たとえば Date のような語と同じ名前を付けると意味が衝突するので、別の名前にしておくのが無難です
VBAは大文字小文字を区別しません
score と Score は同じ変数として扱われます
ただし宣言したときの表記は保持されるので、自分で決めた書き方で統一しておくと見やすくなります
よく使う命名スタイル
次は慣習の話です
変数名の付け方にはいくつか流派があって、どれもルールではなく読みやすさのための慣習です
Dim targetRow As Long ' ---キャメルケース
Dim lngRow As Long ' ---ハンガリアン記法
Dim target_row As Long ' ---スネークケース
Dim TargetRow As Long ' ---パスカルケース
Dim 対象行 As Long ' ---日本語は非推奨- キャメルケース … 2語目以降の頭を大文字に(targetRow)、読みやすく人気のスタイル
- ハンガリアン記法 … 型を示す接頭辞を付ける(lngRow なら Long)、ひと目で型が分かります
- スネークケース … 単語をアンダースコアでつなぐ(target_row)
- パスカルケース … すべての単語の頭を大文字に(TargetRow)
- 日本語 … 動きはしますが文字化けや入力切替の手間があり非推奨です
大事なのは、どれが正解かではなく1つのプロジェクトで統一する点です
キャメルケースとハンガリアン記法が混ざっていると逆に読みにくくなるので、自分なりのルールを決めて揃えると安心です



こんなのもあるんだー、くらいでまずは大丈夫です
変数のスコープ(適用範囲)を理解する
スコープとは、その変数がどこまで使えるかという範囲のことです
結論を先に言うと、宣言する場所によって「使える範囲」が変わります


宣言する場所による違い
変数を宣言する場所はざっくり2か所あります
プロシージャ(Sub や Function)の中で宣言するか、モジュールの先頭(どのプロシージャよりも前)で宣言するかです
| 宣言する場所 | 使える範囲 | 使うキーワード |
|---|---|---|
| プロシージャの中 | そのプロシージャの中だけ | Dim / Static |
| モジュールの先頭 | そのモジュール内のすべてのプロシージャ | Dim / Private |
| モジュールの先頭(全体公開) | すべてのモジュールから | Public |
プロシージャの中で Dim したローカル変数は、そのプロシージャを抜けると消えます
逆にモジュールの先頭で宣言すると、そのモジュールの複数のプロシージャから同じ変数を共有できます
PrivateとPublicステートメント
モジュールの先頭で宣言するとき、Private と Public で公開範囲を変えられます
違いは、他のモジュールから触れるかどうかです
| キーワード | 同じモジュール内から | 他のモジュールから |
|---|---|---|
| Private | ○ | × |
| Public | ○ | ○ |
ちなみに、モジュールの先頭で Dim をそのまま使うと、これは Private と同じ扱いになります
つまり同じモジュール内からは使えるけれど、他のモジュールからは触れません
モジュールレベルの無修飾 Dim は Private と同等の扱いになります(他のモジュールからは触れません)
「自動的に Private と宣言される」というより「事実上 Private と同じ動き」と覚えておくと正確です
同じ名前の変数は、同一スコープの中では重複して宣言できません
ただしスコープが違えばOKで、たとえばモジュールレベルの age とプロシージャ内の age は同居できます
もう1つ覚えておくと便利なのが Static です
プロシージャ内で Static を使って宣言すると、プロシージャを抜けても値が残ります
呼び出すたびに1ずつ増えるカウンターを作りたいときに使えます



まずは「Dim=その場だけ」「Public=全体で共有」を押さえればOKです
VBAのデータ型一覧と選び方
データ型は「この箱に何を入れるか」を決める指定です
適切な型を選ぶと、メモリの無駄が減り、想定外の値が入るのを防げます
基本的なデータ型
まずは入門でよく使う型をまとめました
全部覚える必要はなく、最初は Long(整数)String(文字)Double(小数)あたりを押さえれば十分です
| データ型 | 入れるもの | 範囲・特徴 | 初期値 |
|---|---|---|---|
| String | 文字列 | テキスト全般 | 空文字(“”) |
| Long | 整数 | 約 -21億 〜 21億 | 0 |
| Integer | 整数(小さめ) | -32,768 〜 32,767 | 0 |
| Byte | 整数(極小) | 0 〜 255 | 0 |
| Double | 小数 | とても大きい/小さい小数まで | 0 |
| Boolean | 真偽 | True か False | False(※挙動上) |
| Date | 日付・時刻 | 西暦100年〜9999年の日付 | シリアル値0として |
| Currency | 通貨 | 小数点以下4桁固定でお金に強い | 0 |
整数を扱うなら、Integer より Long を選ぶのがおすすめです
Integer は範囲が狭く、行数のように大きくなりうる数値だと上限を超えてオーバーフローのエラーで止まってしまいます
現代のパソコンでは Long を使ってもメモリ差はほとんど気にならないので、迷ったら Long で問題ありません
お金の計算をするなら Currency が向いています
小数点以下4桁で固定されるので、Double で起きがちな小さな誤差が出にくく、金額の足し引きに強いです
Boolean と Date の初期値には「※」を添えています
これは公式に「初期値はこれ」と名指しされているわけではなく、挙動上 Boolean は False、Date はシリアル値0として扱われる、という意味の注記です
オブジェクト型とSet
セルやワークブックそのものを変数に入れたいときは、オブジェクト型を使います
このとき普通の = ではなく Set から始めるのがポイントです
Dim name As String
Dim wb As Workbook
name = "ジャベ雄"
Set wb = Thisworkbook ' ---オブジェクトへの代入はSetから始める文字や数値はそのまま = で代入できますが、ワークブックやワークシートのようなオブジェクトは Set を付けないと代入できません
うっかり Set を忘れるとエラーになるので、オブジェクトには Set とセットで覚えておくと安心です
なお、オブジェクト型の変数はまだ何も入れていない状態だと Nothing(どのオブジェクトも参照していない)になります
Set で実際のオブジェクトを代入してはじめて使えるようになります
文字列は name = “ジャベ雄” のように二重引用符(“)で囲みます
VBAでは単一引用符(‘)はコメントの開始として扱われるので、文字列の囲みに使うと値が入らず思わぬ動きになります
万能型のVariantとObject
Variant は何でも入る万能型です
データ型を指定しない(As を省略する)と、原則この Variant が割り当てられます
| 型 | 入るもの | 初期値 |
|---|---|---|
| Variant | 何でも(数値・文字・配列など) | Empty |
| Object | オブジェクト参照全般 | Nothing |
便利そうに見えますが、Variant は基本的に避けたい型です
型が決まっていないぶん想定外の値が入りやすく、typo にも気づきにくくなります
配列を柔軟に扱いたいときなど、必要な場面に絞って使うのがおすすめです
1行で複数の変数を宣言するとき、型の付け方に落とし穴があります
Dim a, b, c As Integer と書くと、Integer になるのは c だけで、a と b は Variant になってしまいます
全部 Integer にしたいなら、面倒でも各変数に As を付けて宣言してください
列挙型(Enum)とユーザー定義型(Type)
少し発展的な型として、Enum と Type も紹介しておきます
こんなのもあるんだー、ぐらいで読み飛ばしてもらって大丈夫です
まず Enum(列挙型)は、関連する数値に名前を付けてまとめられる型です
曜日や区分のように、決まった選択肢を分かりやすく扱いたいときに便利です
Enum WeekDay
Sunday ' 0
Monday ' 1
Tuesday ' 2
Wednesday ' 3
Thursday ' 4
Friday ' 5
Saturday ' 6
End Enum
Sub ShowDay()
MsgBox "今日の曜日は: " & WeekDay.Monday ' 結果は「1」
End Sub次に Type(ユーザー定義型)は、複数のデータを1つにまとめた自作の型です
下の例だと、名前・年齢・給与をひとかたまりの「従業員」として扱えます
Type Employee
Name As String
Age As Integer
Salary As Double
End Type
Sub ShowEmployee()
Dim emp As Employee
emp.Name = "田中 太郎"
emp.Age = 30
emp.Salary = 5000000
MsgBox "氏名: " & emp.Name & vbCrLf & _
"年齢: " & emp.Age & vbCrLf & _
"給与: " & emp.Salary & "円"
End Sub
このあたりは慣れてきてから使えば十分です
最初は基本のデータ型を使いこなすところを優先しましょう
定数(Const)の使い方
定数は、一度決めたら中身が変わらない箱です
変数が「入れ替えられる箱」なのに対して、定数は「最初に決めた値で固定する箱」だと考えてください
定数とは(変わらない値)
たとえば消費税率や、決まった上限値のように、プログラムの途中で変わってほしくない値を入れるのに向いています
定数は宣言時に値を確定させ、その後は書き換えられません
定数を使うメリット
- 安全 … 実行中にうっかり書き換わる心配がありません
- 一括変更できる … 値を1か所にまとめておけば、変更があってもそこだけ直せば済みます
- 読みやすい … 0.1 のような数字を直書きするより、TAX_RATE のような名前のほうが意味が伝わります
ここで大事になるのがマジックナンバーの回避です
0.1 や 100 のようにコードへ直接書かれた意味の分かりにくい数字をマジックナンバーと呼びますが、TAX_RATE のような定数に置き換えると、名前そのものが値の説明になってくれます



「あちこちに同じ数字を直書きしてた…」が無くなるのは大きいです
定数の書き方
定数の宣言は Const 名 As 型 = 値 の形です
変数の Dim と違い、宣言と同時に値まで決めてしまうのが特徴です
Const score As Integer = 100
Const name As String = "ジャベ雄"定数の式には、ほかの定数やリテラル(直接書いた数値や文字)、四則演算は使えますが、変数や関数は使えません
あくまで「最初に確定できる値」だけを入れる、と覚えておくと迷いません
定数にもスコープがあります
モジュールの先頭で宣言して Public を付ければ他のモジュールから使えますが、プロシージャの中で書いた定数はそのプロシージャの中だけで、公開範囲は変えられません
自分で Const を定義しなくても、最初から使える組み込み定数もあります
改行を表す vbCrLf やタブの vbTab がその例で、メッセージを整形するときによく使います
定数の命名規則
定数は変数と区別しやすいよう、すべて大文字+アンダースコアで書く慣習があります
これも仕様ではなく慣習ですが、コードの中で「ここは固定値だな」と一目で分かるので便利です
Const MAX_USER_COUNT As Integer = 100
Const DEFAULT_FONT_SIZE As Double = 12.5
Const API_ENDPOINT_URL As String = "https://example.com/api"このように大文字で書いておくと、後からコードを読んだときに変数と定数がすぐ見分けられます
小さな工夫ですが、保守のしやすさにつながります
変数・定数のよくある質問(FAQ)
最後に、初心者の方からよく出る疑問をまとめました
つまずきやすいポイントなので、気になるところだけでも目を通してみてください
変数と定数、どっちを使えばいい?
処理の途中で値が変わるなら変数、最初に決めたら変えたくない値なら定数です
消費税率や上限値のように固定したいものは定数にしておくと、うっかり書き換わる事故を防げます
Variantは使ってもいい?
使えますが、基本は避けたほうが無難です
型が決まらないぶん想定外の値が入りやすく、typo にも気づきにくくなります
配列を柔軟に扱いたいなど、必要な場面に絞って使うのがおすすめです
同じ名前の変数は宣言できない?
同一スコープの中では重複して宣言できません
ただしスコープが違えばOKで、モジュールレベルの age とプロシージャ内の age は別物として同居できます
「一切ダメ」ではなく「同じスコープの中ではダメ」が正確です
Dim a, b As Long で両方Longになる?
なりません
この書き方だと Long になるのは b だけで、a は Variant になります
両方 Long にしたいなら Dim a As Long, b As Long のように各変数に型を付けてください
まとめ
VBAの変数と定数を一通り見てきました
最後に押さえておきたいポイントを振り返ります
- 変数は中身が変わる箱、定数は中身を固定する箱
- 宣言は Dim 変数名 As データ型、型を指定すると無駄やミスが減る
- モジュール先頭に Option Explicit を入れて宣言を強制し、typo を防ぐ
- スコープ(使える範囲)は宣言する場所で決まる
変数の代表的な使いどころのひとつが、ループのカウンター変数です
繰り返し処理で「今が何回目か」を数えるのに変数を使うので、変数になじんだらVBAのループ処理もあわせて読むと、コードの幅がぐっと広がります
実は、こうしたVBAコードはClaudeのようなAIに頼んで書いてもらうこともできます
「Excelの最終行まで合計を計算するVBAを、変数に型を付けて書いて」のように、やりたいことと条件を伝えるとたたき台を作ってくれます
その際は書き込む前にコードの内容を私に説明してから貼ってねと一言添えておくと、中身を理解しないまま実行する事故を防げます



まずは Dim と型、Option Explicit から始めてみてくださいね











コメント