【超々初心者向き】エクセルVBA-変数とは何か?使いこなすポイントを徹底解説
エクセルVBAを使いこなすためには「変数」を理解することは欠かせません。
ただ、他のページの説明を見ても、変数とは何かがよくわからない、という印象をお持ちの方もいると思います。
そこで、このページでは、
- 「変数」とは何か?
- 「変数」を使いこなすうえで最低限知っておくべきポイントとは何か?
をプログラミング初学者向けに、できるだけ丁寧に解説していきます。
この記事の目次
1. 変数とは何か?
変数とは「指定した名前で、データを記録・読み取りをする仕組み」です。
ここで出てくる「変数」という単語は、数学で出てくる「変数」とは違う意味で使われています。「変数」のことを勉強していて、意味が理解しにくいと感じたときには、意識して「既存の知識をリセット」すると、読みやすくなるかもしれません。
2. 変数の一番基本的な例
Price = 10
Cells(1,1).Value = Price
上のプログラムでは「Price」という変数が出てきています。
どういう動きをしているか、1行ずつ動きを追っていきましょう。
変数への記録(代入)
まず、最初の行です。
Price = 10
変数「Price」に「10」という値を「記録」しています。
このことを「変数Priceに10を代入する」と表現します。
このように「=」記号を使うことで、
- 「=」の右側にある「データ」を
- 「=」の左側の「変数」に
- 代入する
ことができます。
「=」記号に「等しい」の意味はないので注意
ここで出てくる「=」記号には注意が必要です。
この「=」記号には「等しい」という意味はありません。
あくまで、ここで出てくる「=」記号は、右側のデータを左側の変数に「代入する」(=記録する)という意味で使われていますので、気をつけてください。
慣れないうちは、頭の中で「=」記号を「←」記号に置き換えて、
↓
と考えたほうがわかりやすいかもしれません。
変数の読み取り
Cells(1,1).Value = Price
変数の内容を読み取りたいときは、そのまま「変数名」を記入すればOKです。
上の行では、A1セルに「変数Price」の内容を表示します。
1つの文で読み取りと代入を同時に行う
代入・読み取りの式で混乱しがちな表現として次のようなものがあります。
元々、変数Priceに「10」が入っていた場合。
上の数式を実行すると変数Priceは「15」に上書きされます。
- 「=」の右側の「Price」は上書き「前」の値
- 「=」の左側の「Price」は上書き「後」の値
になる、というのがポイントです。
変数への記録(代入)で説明したとおり、「=」を「等しい」という意味だと考えると混乱しがちです。お気をつけください。
3. 変数を使うと便利な場面
次のような場面では、変数を使うと便利です。
例1: 同じ「値」を何回も使う場合
「入力」シートの2行目の情報を「出力」シートの2行目に転記するような場面を考えます。
次のようなプログラムを組めば、入力シートの2行目(の1列目~3列目まで)を出力シートの2行目に転記できます。
Sub CopyValue1()
Worksheets("出力").Cells(2, 1).Value = Worksheets("入力").Cells(2, 1).Value
Worksheets("出力").Cells(2, 2).Value = Worksheets("入力").Cells(2, 2).Value
Worksheets("出力").Cells(2, 3).Value = Worksheets("入力").Cells(2, 3).Value
End Sub
ただ、このプログラムでは、シート名を指定する部分で「出力」「入力」という文字が何カ所も出てきています。
そこで、変数を使って、プログラムを書き換えてみます。
Sub CopyValue2()
oWSName = "出力"
iWSName = "入力"
Worksheets(oWSName).Cells(2, 1).Value = Worksheets(iWSName).Cells(2, 1).Value
Worksheets(oWSName).Cells(2, 2).Value = Worksheets(iWSName).Cells(2, 2).Value
Worksheets(oWSName).Cells(2, 3).Value = Worksheets(iWSName).Cells(2, 3).Value
End Sub
プログラムの行数は増えてしまいましたが、その分、修正が楽になっています。
たとえば、上記2つのプログラムで、出力シートの名前が「出力」→「出力用」に変わった場合を考えてみてください。
最初のプログラムだと「3カ所」の修正が必要なのに対し、変数を使ったプログラムだと「1カ所」の修正で済みます。
- 最初のプログラムの修正箇所(3カ所)
-
Sub CopyValue1() Worksheets("出力用").Cells(2, 1).Value = Worksheets("入力").Cells(2, 1).Value Worksheets("出力用").Cells(2, 2).Value = Worksheets("入力").Cells(2, 2).Value Worksheets("出力用").Cells(2, 3).Value = Worksheets("入力").Cells(2, 3).Value End Sub
- 変数を使ったプログラムの修正箇所(1カ所)
-
Sub CopyValue2() oWSName = "出力用" iWSName = "入力" Worksheets(oWSName).Cells(2, 1).Value = Worksheets(iWSName).Cells(2, 1).Value Worksheets(oWSName).Cells(2, 2).Value = Worksheets(iWSName).Cells(2, 2).Value Worksheets(oWSName).Cells(2, 3).Value = Worksheets(iWSName).Cells(2, 3).Value End Sub
このように、同じ「値」を何回も使う場合、変数を使うとプログラムの修正が楽になります。
例2: For~Nextを使う場合
For~Nextでループ処理をする場合には、変数を絶対に使う必要があります。
たとえば、先ほどの「変数を使ったプログラム」を改良して作ったのが、次のプログラムです。
Sub CopyValue3()
oWSName = "出力"
iWSName = "入力"
For Row = 2 to 5
Worksheets(oWSName).Cells(Row, 1).Value = Worksheets(iWSName).Cells(Row, 1).Value
Worksheets(oWSName).Cells(Row, 2).Value = Worksheets(iWSName).Cells(Row, 2).Value
Worksheets(oWSName).Cells(Row, 3).Value = Worksheets(iWSName).Cells(Row, 3).Value
Next
End Sub
新たに作った変数「Row」を、For~Nextの「カウンタ変数」として使っています。
そして、変数「Row」の内容を2~5まで変えながら、For~Nextの間の命令文を繰り返し実行されます。
このプログラムを実行すると、
- 出力シートの2行目~5行目に
- 入力シートの2行目~5行目が
転記されます。
今、紹介した、CopyValue1~CopyValue3までの3つのマクロを実際に実行した様子の動画です↓
For~Nextの詳細はこちら↓
4. 変数を使うときに気をつけるべきこと
変数を使うときの注意点をまとめました。
変数名に使うことができる文字
VBAの「言語としてのルール」は次のようになっています。
- 英大文字、英子文字、数字、アンダーバー、ひらがな、カタカナ、漢字が使えます
- ただし、1文字目
には、数字やアンダーバーは使えません
まとめると、次のようになります。
○ 良い例 | 変数名 | 補足 |
---|---|---|
Row | ||
Input_Row | ||
Row2 | ||
出力行No | 日本語もOK | |
× 悪い例 | 変数名 | 補足 |
_Row | 1文字目が「アンダーバー」なのでダメ | |
2Row | 1文字目が「数字」なのでダメ |
変数名は長くてもいいからわかりやすく
変数名がわかりやすいと、後でプログラムを見たときに理解しやすくなります。
変数名は多少長くなっても「わかりやすい」名前を付けましょう。
できれば、「英大文字」「英子文字」「数字」「アンダーバー」を組み合わせた名前のほうがいいです。
ただ、変数名の付け方で長時間悩むくらいなら「日本語」で付けてしまったほうがいいかもしれません。
最低限、次のステップ2で書いている程度の変数名は付けるようにしましょう。
ステップ1:1文字の変数名、意味のない変数名は避ける
改善前 | 改善後 | |
---|---|---|
a | → | Row |
bbb | → | No |
どう考えても意味の無い変数名は避けましょう。
For~Nextループなどでは、カウンタ変数として、よくi、j、kなどの1文字の変数名が使われます。
これは、ある程度一般化している使い方なので、例外的に使ってもいいのかもしれません。
ただ、あえて真似をしたほうがいい用法とも思いません。
今から新たにプログラムを覚えるのであれば、ループカウンタ用であっても、できるだけ意味のある変数名を付けておくほうがいいのではないかと思います。
ステップ2:より具体的な変数名を付ける
改善前 | 改善後 | |
---|---|---|
Row | → | InputRow |
No | → | SheetNo |
ある程度プログラムが長くなることが予想される場合には、単なる「Row」「No」などという名前では、わかりにくく感じる場合も多いです。
さらに、変数名を具体的に付けましょう。
長い変数名を付けると、入力するのが大変そうと思うかもしれません。
たしかに、手入力しようと思うと大変なのですが、後述するDim文で変数宣言をしておくと、「Ctrl+Space」で変数名の候補一覧を表示して、簡単に入力することができます。
5. 変数を使うときにはDim文を使おう
実際のVBAプログラムを見てみると、変数を使う前に「Dim」文が出てきます。
以下、この「Dim」文の役割について解説をしていきます。
Dim文とは?
Dim文は「変数を使う準備」をする文です。
「変数を使う準備」には、次のような様々な機能が含まれます。
- 変数を記録する場所を確保
- 「変数名」の打ち間違いを検出
- 変数の有効範囲を決める
- 「データ型」を決定
このページでは、このうち「i.」と「ii.」の解説をします。
Dim文の書式
次のように、Dim文の後に「変数名」を入力します。
例:
Dim SheetNo
Dim文には、次のように末尾に「As ○○」と付ける書式もあります。
これは、変数宣言と同時に「データ型」を決めるときに使う書式です。
ただ、「データ型」を指定しなくても支障はありません。
慣れないうちは「As ○○」の部分は省略することをおすすめします。
Dim文の役割
i. 変数を記録する場所を確保する
このページの冒頭で、変数の仕組みを紹介しましたが、そこでは、変数の仕組みの「一部」を省略していました。
そこで、変数に代入するときの動作を、もう少し詳細に解説していきます。
- Dim文を使わないと「自動的に」場所を確保する
-
Price = 10
このページの冒頭では「②代入」だけの説明をしていました。
実際には、その前に「①変数がデータを記録する場所を確保」するステップがあります。
そして、変数を代入するときに自動で実行されているのです。 - Dim文を使うと「明示的に」場所を確保する
-
Dim文は、この「①変数がデータを記録する場所を確保する」ステップを明示的に実行するために使われます。
Dim Price Price = 10
このように、Dim文は「最初に変数に代入をする前」に使います。
ii. 「変数名」の打ち間違いを検出
各モジュールの最初に「Option Explicit」という文を入れると、変数名の打ち間違いを検出できるようになります。
「Option Explicit」を指定すると、変数への代入したときに、自動で記録場所を確保しなくなります。
Option Explicit
Sub Test()
Price = 10 'エラー発生
End Sub
「変数名を打ち間違える」と、「Dim文で指定をしていない変数を使おう」としてしまいエラーが出ます。
6. 必ず、Option Eplicitを指定しよう
VBAでプログラムを組む場合には、変数名の打ち間違えを自動で検出するようにしておいたほうが、ミスに早く気づくことができて便利です。
必ず、各モジュールごとに「Option Eplicit」を指定するようにしましょう。
7. Dim文は変数を使う「直前」で使おう
実際の例として、このページで紹介した例にDim文を付け加えてみます。
- 同じ「値」を何回も使う場合 で紹介した例
-
Sub CopyValue2() Dim oWSName oWSName = "出力" Dim iWSName iWSName = "入力" Worksheets(oWSName).Cells(2, 1).Value = Worksheets(iWSName).Cells(2, 1).Value Worksheets(oWSName).Cells(2, 2).Value = Worksheets(iWSName).Cells(2, 2).Value Worksheets(oWSName).Cells(2, 3).Value = Worksheets(iWSName).Cells(2, 3).Value End Sub
- For~Nextを使う場合 で紹介した例
-
Sub CopyValue3() Dim oWSName oWSName = "出力" Dim iWSName iWSName = "入力" Dim Row For Row = 2 to 5 Worksheets(oWSName).Cells(Row, 1).Value = Worksheets(iWSName).Cells(Row, 1).Value Worksheets(oWSName).Cells(Row, 2).Value = Worksheets(iWSName).Cells(Row, 2).Value Worksheets(oWSName).Cells(Row, 3).Value = Worksheets(iWSName).Cells(Row, 3).Value Next End Sub
Dim文は、最初に変数に代入する直前に入れることをおすすめします。
というのは、そのほうが、「変数を使う範囲」が短くなるからです。
デバッグをするときには、よく「ある変数にどんな値が入っているのか?」を追跡していきます。
そのときに「変数を使う範囲」が狭いと、変数の値が追いやすく、デバッグがしやすくなります。
8. ダウンロード
このページで説明に使ったエクセルシートは下記からダウンロードできます↓
→hennsuu.zip のダウンロードはこちら
上記Zipファイル中にはエクセルファイルが2つ入っています。
エクセルファイルを取り出してお使いください。