VBAでは変数を使うとき、最初に変数を定義すると便利です。
このページでは変数を定義する方法や、変数名の付け方などについて解説します。
上記の動画で変数について解説していますので、イメージを掴みたい人はご覧ください。
以下で詳しく説明していきます。
目次
変数とは
変数とはプログラミングをするときに、データを取り扱うための入れ物です。
この入れ物には、数値、文字列やオブジェクトのようなプログラミングで取り扱うあらゆるものを入れることができます。
Microsoftの公式ドキュメントの説明は以下の通りです。
データを格納できる名前付きの保存場所。プログラムの実行中に変更できます。
各変数には、スコープ内で変数を一意に識別する名前があります。 データ型は、指定することも指定しないことも可能です。
変数名は、アルファベット文字で始まり同じスコープ内で一意であり、255 文字以下である必要があり、埋め込まれたピリオドまたは型宣言文字を含むことはできません。
変数名は漢字や平仮名でも可です。
VBAでは変数を必ずしも宣言しなくてもよい
一部プログラミング言語では、変数宣言や型宣言という「これからこういった型の変数を使用します」という宣言が必要です。
しかしVBAの変数は変数宣言や型の宣言は、任意で設定を変更することが可能です。
したがって、変数宣言してもいいし、しなくてもプログラム作成は可能です。
変数宣言を推奨する理由
しかし私はVBAでは変数宣言を推奨しています。なぜなら「意図しないミス」を防止することができるからです。
詳しい理由は以下のページで紹介しています。
ただし変数宣言が分かりづらかったり面倒に感じたりする人もいるはずです。
本人が不要と感じるのであれば、必ずしも変数宣言をする必要はありません。
変数を宣言する方法|文字列、セルの値、数値など
変数を扱うパターンとして以下の4つについて説明します。
2. 変数にセルの値を入れる|ダブルクォーテーションは不要
3. 変数に変数を入れる|ダブルクォーテーションは不要
4. 変数に文字列を入れる|ダブルクォーテーションが必要
実際に変数を使うVBAプログラムの事例として以下を用います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Option Explicit '変数宣言の指定 Sub Sample01() 'プログラム開始 '1. 変数に数値を入れる|ダブルクォーテーションは不要 Dim x x = 5 Debug.Print x '2. 変数にセルの値を入れる|ダブルクォーテーションは不要 Dim y y = Range("A1").Value Debug.Print y '3. 変数に変数を入れる|ダブルクォーテーションは不要 Dim z z = x + y Debug.Print z '4. 変数に文字列を入れる|ダブルクォーテーションが必要 Dim w w = "パソコンスキルの教科書" Debug.Print w End Sub 'プログラム終了 |
以下で詳しく説明していきます。
1. 変数に数値を入れる|ダブルクォーテーションは不要
1 2 3 4 5 |
Dim x x = 5 Debug.Print x >>>5 |
変数定義を行うときは、「Dim XXX」と記述します。
xを変数として宣言し、「5」という数値を入れます。
「変数 = 代入値」とすることで、変数を代入値として扱うことができます。
なお「Debug.Print XXX」と記述することで、「XXX」に設定されている値を表示することができます。
2. 変数にセルの値を入れる|ダブルクォーテーションは不要
1 2 3 4 5 |
Dim y y = Range("A1").Value Debug.Print y >>>10 |
yを変数として宣言し、セルA1の値とします。
ここではセルA1に「10」が入力されているため、y=10となります。
3. 変数に変数を入れる|ダブルクォーテーションは不要
1 2 3 4 5 |
Dim z z = x + y Debug.Print z >>>15 |
変数zを宣言し、変数xと変数yを入れて計算します。
ここではx=5, y=10なので、z=15となります。
「z = x + y」で、zを「x+y」とすることができます。
つまり、右辺を先に計算して左辺に値にするため、先に右辺が計算されることを覚えておくと役立ちます。
4. 変数に変数を入れる|ダブルクォーテーションは不要
1 2 3 4 5 |
Dim w w = "パソコンスキルの教科書" Debug.Print w >>>パソコンスキルの教科書 |
変数wを宣言し、「パソコンスキルの教科書」という文字列とします。
文字列の場合は、”(ダブルクォーテーション)で囲む必要があります。
そのためw=”パソコンスキルの教科書”とする必要があります。
もし””で囲むのを忘れると、「パソコンスキルの教科書」という変数として処理されます。
補足. 変数宣言をまとめて行う
1 |
Dim x,y,z,w |
上記のように変数をまとめて1行で宣言することもできます。
記述が減るので、これも覚えておくと役立ちます。
ここまで変数の設定方法について紹介してきました。
しかし「そもそも変数を覚えてないといけないのか?」という疑問を抱いている人もいるかもしれません。
そこで「なぜ変数という概念が必要なのか?」ということを説明していきます。
変数を使う意味・メリット
変数を使うにはそれなりの意味やメリットがあります。
具体的には以下の3つです。
2. メンテナンスが簡単になる
3. 様々な処理を行えるようになる
以下で詳しく説明していきます。
1. プログラムの記述量が少なくなる
A列に1~10まで数値を入力するマクロを考えてみます。
このとき変数を使用する場合としない場合で、プログラムの記述量を減らすことができます。
・変数を使用する場合
以下でそれぞれします。
変数を使用しない場合
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Sample02_変数なし() Range("A1").Value = 1 Range("A2").Value = 2 Range("A3").Value = 3 Range("A4").Value = 4 Range("A5").Value = 5 Range("A6").Value = 6 Range("A7").Value = 7 Range("A8").Value = 8 Range("A9").Value = 9 Range("A10").Value = 10 End Sub |
このプログラムは全部で12行あります。
上記のプログラムをFor Next文と変数を使って記述すると以下のようになります。
変数を使用する場合
1 2 3 4 5 6 |
Sub Sample02_変数あり() Dim i As Long For i = 1 To 10 Range("A" & i).Value = i Next End Sub |
このプログラムは6行目で記述できます。
このように変数を使うことで、プログラムの記述量を減らすことができます。
2. メンテナンスが簡単になる
エクセルマクロを使うと、メンテナンスが簡単になります。
たとえば、以下のように消費税を掛ける事例を考えます。
変数を使用しない場合
1 2 3 4 5 6 7 |
Sub Sample03_変数なし() Range("B1").Value = 1000 * 1.1 Range("B2").Value = 2000 * 1.1 Range("B3").Value = 3000 * 1.1 Range("B4").Value = 4000 * 1.1 Range("B5").Value = 5000 * 1.1 End Sub |
変数を使用すると、それぞれに「1.1」を掛けています。
しかしもし消費税が改定されたら、上記の「1.1」の新しい税率に変更する必要があります。
全部で5箇所あるので、それらを全て変更する必要があります。
変数を使用する場合
1 2 3 4 5 6 7 8 9 |
Sub Sample03_変数あり() Dim a a = 1.1 Range("B1").Value = 1000 * a Range("B2").Value = 2000 * a Range("B3").Value = 3000 * a Range("B4").Value = 4000 * a Range("B5").Value = 5000 * a End Sub |
変数を設定しておくと、最初に「a=1.1」と設定しておけば、4行目以降は修正は不要です。
もし新しい税率が導入されても、3行目の税率(a)を変更すれば5箇所修正する必要はないのです。
このようにメンテナンスが簡単になるのが変数を使うメリットの一つです。
3. 様々な処理を行えるようになる
変数を使えるようになると、様々な処理を行えるようになります。
その一つがコレクションと呼ばれる「同じ種類のオブジェクトを複数まとめたもの」をまとめて処理できるようになることです。
たとえば、以下のようなブック内の全ワークシート(コレクション)に対して処理を行い、シート名を取得することができます。
ワークシートの名前を取得
以下のプログラムでエクセルブックの全シート名を取得することができます。
1 2 3 4 5 6 |
Sub Sample04() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Debug.Print ws.Name Next End Sub |
Debug.Printの結果は以下です。
1 2 3 |
>>>Sheet1 >>>Sheet2 >>>Sheet3 |
「Dim ws As Worksheet」でワークシート型の変数を設定し、「For Each ws In ThisWorkbook.Worksheets」でコレクションを一つずつ連続処理することができます。
このようなコレクションを全て処理するプログラムは変数設定していないと、実現することが難しいです。
変数を使わないと高度な処理は難しい
ここまで変数の長所について述べてきました。
変数に苦手意識を持つ人が多いですが、残念ながら変数を使えるようにならないと、高度な処理は難しいのが現実です。
自分が思うプログラムを作成しようとしたとき、以下のような処理は必ずと言っていいほど必要になります。
とくに、VBAプログラムではForNextのような繰り返し処理を行うことができるようにならないと、プログラムの本領発揮できません。
それこそマクロの自動記録では、簡単な処理しか実装できないのです。
そのため自分が思い描くプログラムを書きたいのであれば、変数は使えるようにならざるを得ないと言えます。
変数の型と初期値
No | データ型 | 取りうる値 | 初期値 |
---|---|---|---|
1 | Boolean | True または False | False |
2 | Date | 100 年 1 月 1 日 から 9999 年 12 月 31 日 | 0 |
3 | Double (倍精度浮動小数点数) | -1.79769313486231E308 から -4.94065645841247E-324 (負の値) 4.94065645841247E-324 から 1.79769313486232E308 (正の値) |
0 |
4 | Integer | -32,768 ~ 32,767 | 0 |
5 | Long (Long 整数) | -2,147, 483,648 ~ 2,147, 483,647 | 0 |
6 | LongLong (LongLong 整数) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 |
7 | Object | 任意の Object 参照 | null |
8 | String (可変長) | 0 ? 約 20 億 | (空欄) |
9 | Variant (数値) | 最大で Double の範囲までの任意の数値 | 0 |
10 | Variant(文字列) | 可変長 文字列型 と同じ範囲 | (空欄) |
上記では、代表的な変数の取りうる値や初期値について紹介しました。
なおここではオブジェクトには触れていませんが、オブジェクトの変数設定にはSetが必要になります。
補足. オブジェクトの変数設定
たとえばワークシートを設定するとき、以下のように記述します。
1 2 |
Dim ws As Worksheet Set ws = Worksheets("Sheet1") |
「Set ws = Worksheets(“Sheet1”)」とすることで、wsをSheet1として扱うことができます。
「ws = Worksheets(“Sheet1”)」だとエラーが出てしまいますので、注意が必要です。
補足しておきます。
変数の記載ルール
変数に限らずVBモジュールのプロシージャ、定数、および引数に名前を付けるときには、以下のルールがあります。
・長さは255文字以内にする
・一般に、Visual Basic やホストアプリケーションで使用されている関数、ステートメント、メソッド、および組み込み定数の名前は使用しない
・同じ変数を2回以上繰り返し宣言できない
・アルファベット、日本語でも可能
上記のようなルールがあります。その他、VBAを作成する中で間違った変数設定をすると、エラー表示されます。
その都度、学んでいけば、自ずと変数については身についていくはずです。
ここまでいろいろとお伝えしてきましたが、手を動かしていくなかで知識を補っていくのが一番上達が早いです。