VBAを習得するうえで、いくつかの重要なポイントがありますが、中でも「変数」は、間違いなく欠かせない要素の一つです。ただ、一度理解してしまえばなんて事はない変数ですが、最初はイメージしずらいのも変数の特徴だと思います。
この記事では、そんなVBAにおける重要な存在である変数について、まずは変数とは?という基本的なところを抑えつつ、具体的にどういう活用方法があるかについてわかりやすく解説していきます。
変数とは
変数とは、プログラムの実行中に変化する値を一時的に格納しておくメモリ上の領域です。
変数には固有の名前を付けることができ、新しい値を代入することで、変数の中身がどんどん変化していきます。
下図は、変数を「一時的な箱」に見立てたイメージ図です。このように変数には「代入」という手段で、値(数値、文字列、日付等)を格納することができ、新たな値を代入すると、以前の値は消去されます。


どんどん上書きされていくんですね!
上記のイメージ図を、実際のVBAコードで表してみましょう。
Dim A As Integer
A = 123
A = 456
MsgBox A
上記のコードでは A
という変数を使っています。
そして2行目では変数 A
に 123
という値を格納しています。このように、左側に変数、右側に値を記載し、「=
(イコール)」で結ぶことで、変数に値を代入することができます。
なお、このプログラムを実行すると、以下のとおりメッセージボックスが表示されます。

2行目までプログラムを実行した段階では、変数 A
に 123
が格納されている状態ですが、3行目を実行した段階で 456
が格納されるため、メッセージボックスには 456
が表示されるというわけです。
変数は「一時的な値を格納する箱」というイメージはつかめましたでしょうか?
変数の命名規則とおすすめのルール
命名規則
変数には自由に名前を付けることができますが、システム的な制約もあります。以下に挙げる点は変数名として使用できませんので注意してください。
- 先頭文字に数字や記号を使用できない
- 半角255文字を超える名前を付けることはできない
- 記号(
.
(ピリオド)、!
(感嘆符)など)、スペースは使用できない
※「_
(アンダースコア)は使用可能) - 同じプロシージャ内で重複した名前は使用できない
- 予約語(ステートメント、関数など)と同じ名前を付けることはできない

上記の制約を除けば、英数字、漢字、ひらがな、カタカナなど自由に使えるよ
おすすめの名前の付け方
制約さえ避ければ、あとは自由に名前を付けられるとはいえ、適当すぎるとコードの可読性が下がります。

前述のサンプルコードでは A
という変数名にしてるけど、あんまりよくないかもですねぇ…
分かりやすい変数名はコードの流れが把握しやすくなります。特に、複数人で開発する際や、後任の担当者のことを考慮すると分かりやすさは重要です。
そのためには、「なるべく具体的で意味のある名前」を付けましょう。例えば、次のような感じです。
- 顧客名を格納 → customerName
- 郵便番号を格納 → zipCode
- 注文日を格納 → orderDate
変数名の付け方(特に英語の変数名)については、こちらの記事でも詳しく解説しています。

変数の活用事例
変数には様々な値を格納できることは分かりましたが、これをどの場面でどう活用するかについて、3つの実例で解説します。
テキストボックス入力値を変数に格納→参照する
フォームのテキストボックスに入力された値によって後続の処理を分岐させる――このような処理は、VBAではよく見かけます。
Dim status As String
status = Me.テキスト10
If status = "完了" Then
MsgBox "すでに完了しています。"
ElseIf status = "未対応" Then
MsgBox "まだ対応していません。"
Else
MsgBox "処理中です。"
End If
上記のコードでは、2行目で変数 status
にテキストボックスの値( 完了
)を代入し、その値をもとに If
文で処理を分岐させ、内容に応じてメッセージボックスを表示する処理になっています。
イメージ図は下記のとおりです。

変数を使わずに status
の部分をすべて Me.テキスト10
に置き換えても、処理としては同じ動作になります。しかし、それではコードの見通しが悪くなり、可読性が下がってしまいます。
また、テキストボックスの名前を変更することになった場合、変数を使っていなければ、コード中のすべての Me.テキスト10
を修正する必要があります。一方、変数を使っていれば、該当箇所(この例では2行目)を修正するだけで済みます。
このように、変数を使うことには「可読性の向上」や「修正箇所を最小限にできる」といったメリットがあるのです。

今回のサンプルコードではIF文の中に、メッセージボックスが表示される処理を記述していますが、実際は様々な処理内容を記述します。
ループ処理のカウント管理
プログラミングでは、同じ処理を何度も繰り返す場面がよくあります。
たとえば、テーブルに格納されている100件のデータを1件ずつ参照して処理する場合、データの冒頭から最後までのデータを参照する処理が必要です。
こうした繰り返し処理を行うために使うのが「ループ処理」です。
VBAにおけるLoop処理には、For~Nextステートメント
文や Do~Loopステートメント
がありますが、いずれの場合も繰り返す回数を記録するループカウンタとしての変数が必要となります。
以下は繰り返し処理のサンプルコードです。
Dim i As Integer
For i = 1 To 5
MsgBox "今は " & i & " 回目の処理です"
Next i
上記コードの i
がループカウンタ変数です。
2行目の処理で i
には 1
が格納され、4行目の Next i
を経て、また2行目に戻ります。この際 i
に 1
が加算され 2
となります。こういった具合にループカウンタが増加し、i
が 5
になった段階で、このプログラムは終了します。
カウンターという変動する値を保持することも、変数の役割の一つです。

前述した変数の命名規則では「なるべく意味のある名前」といいましたが、ループカウンター用の変数は古くから慣習として i
, j
, k
などが使用されてきました。
特段の理由がなければこれらを使うことで、他者からも認識されやすいコードになります。
SQLを変数に格納して実行
こちらの記事では、クエリではなくSQLを活用することのメリットを解説しています。
VBAの中でSQLを実行する場合も、一旦変数に格納してから実行すると、可読性が高まります。
サンプルコードは以下のとおりです。
Dim strSQL As String
Dim userName As String
Dim telNo As String
userName = "山田太郎"
telNo = "090-1234-5678"
strSQL = "INSERT INTO T_顧客 (氏名, 電話番号) " & _
"VALUES ('" & userName & "', '" & telNo & "')"
CurrentDb.Execute strSQL
MsgBox "顧客を追加しました。"
8,9行目がSQL文を変数 strSQL
に格納しているコードです。
このサンプルでは比較的シンプルな記述ですが、複雑なものになると記述自体が長くなることに加え、複数のSQLを連続して実行することも少なくありません。
複雑になればなるほど、SQL文を一旦変数(場合によっては 配列 )に格納することにより、可読性が大幅に向上するといえるでしょう。
まとめ
今回は、VBAにおける変数とは?ということで、変数のイメージを掴んでいただく内容で説明させていただきました。今回ご紹介した活用方法はごく一部ですが、イメージを掴めれば幸いです。
変数には、変数宣言や適用範囲、データ型といった、まだまだ理解しておくべき点が多々ありますので、引き続き別記事でも解説していきたいと思います。