VBAでもよく使うのが変数ですよね。数字や文字列などの型を指定し値を格納する変数にそれぞれ名前を付けて、その変数名を使って処理を記述します。
その変数名に代入する値を必要に応じて変えることで処理結果が変わってきます。
この記事では、変数について
- 変数とは
- データ型とは
- 変数の宣言と定義
- 変数の初期化と代入
- 変数に配列を指定する方法
- 変数のスコープについて
など基本的な内容から、応用的な内容についても解説していきます。
今回は変数について、使い方をわかりやすく解説します!
変数とは
変数とはデータを格納しておく入れ物のようなものです。変数は値を代入したり参照したりすることができます。
次のコードを見てください。
Sub macro0_1() Worksheets("シート名1").Range(“A1”) = 1 Worksheets("シート名1").Range(“B1”) = "東京都" Worksheets("シート名1").Range(“C1”) = "〒XXX-XXXX" End Sub
シート名1にのA1 ~ C1までセルに値を書き込む処理ですが、このシート名がシート2に変わった場合は全てを書き換える必要があります。
このコードを変数を使って置き換えると、次のようにすることができます。
Sub macro0_2() 'シート名を文字列の変数として作成 Dim shName as String shName = "シート名1" Worksheets(shName).Range("A1") = 1 Worksheets(shName).Range("B1") = "東京都" Worksheets(shName).Range("C1") = "〒XXX-XXXX" End Sub
こうしておくことで、シート名が変わった時に一番上に書いているシート名1を変えるだけで変更することができます。
変数は、文字列以外にも数値や様々な型があります。
データ型とは
データ型とは、数字や文字などのデータをメモリ上に確保する領域やバイト長、確保した領域の扱い方などを指定するものになります。
VBAで使われる型には以下のようなものがあります。
数値を格納する変数:
データ型 | 名称 | 消費メモリ | 説明 |
---|---|---|---|
Byte | バイト型 | 1バイト | 0~255 |
Integer | 整数型 | 2バイト | -32768~32767 |
Long | 長整数型 | 4バイト | -2147483648~2147483647 |
Single | 単精度浮動小数点数型 | 4バイト | 1.401298E-45 ~ 3.402823E38(絶対値) |
Double | 倍精度浮動小数点数型 | 8バイト | 4.94065645841247E-324 ~ 1.79769313486232E308 (絶対値) |
Currency | 通貨型 | 8バイト | -922337203685477.5808 ~ 922337203685477.5807 |
そのほかの値を格納する変数:
データ型 | 名称 | 消費メモリ | 説明 |
---|---|---|---|
String | 文字列型 | 2バイト | 最大約20億文字まで |
Date | 日付型 | 8バイト | 西暦100 年1月1日~西暦9999年12月31日までの日付と時刻 |
Boolean | ブール型 | 2バイト | 真 (True) または偽 (False) |
Objec | オブジェクト型 | 4バイト | オブジェクトを参照するデータ型 |
Variant | バリアント型 | 16バイト | すべてのデータ型 |
とはいえ、ここまで数があると覚えるのも大変なので、最初のうちは次の4つだけ覚えておけば大丈夫です!
- 整数 :Long
- 小数 :Double
- 文字列:Strng
- その他:Variant
その他と書いているのは、整数、小数、文字列以外の場合ですね。
Variantは変数に値を入れた時に、入れた値によって文字列、数値など型を自動で決めてくれる便利な変数の型です。万能なので、型がわからない場合などに覚えておくと便利ですね。
変数の宣言と定義
変数は変数名を指定して宣言し、データ型を指定して定義します。
変数を宣言し、定義するには「Dim」句と「As」句を使って以下のように記述します。
Dim 変数名 As データ型名
データ型の指定を省略することもできます。
Dim 変数名
この場合はバリアント型になります。
複数の変数を宣言する場合は次のように記述できます。
Dim 変数名1 As データ型名1, 変数名2 As データ型名2, ・・・・・・
同じ型で複数の変数を指定する場合、次のように記述すると注意が必要です。
Dim 変数名1, 変数名2, 変数名3 As データ型名
この場合、データ型を指定したのは変数3だけになります。
ほかの変数名1、変数名2は型の指定が省略されたとみなされ、バリアント型となります。消費メモリが気になる場合は注意しましょう。
変数名の規則
変数名をつける上で守らなければならない規則があります。
まず、変数には英数字、漢字、ひらがな、カタカナのほかにもアンダーバー(_)が使えます。ただし、スペースや記号は使えません。
また、変数名の先頭の文字に数字やアンダーバー(_)は使えません。同じスコープ内では同じ名前は使えません。
スコープについては後ほど解説します。変数名の長さは半角で255字までです。
宣言の強制
変数の宣言を明示的に行わなければ、変数名が競合したり、変数名の入力ミスによりエラーが発生しやすくなります。
これを防ぐために、変数の宣言を強制する設定があります。設定方法は次のとおりです。
メニューバーから「ツール」→「オプション」を選択します。
「変数の宣言を強制する」にチェックを入れて、「OK」ボタンをクリックします。
コード記述部に「Option Explicit」と表示されれば、変数の宣言が強制されていることになります。
(「Option Explicit」が表示されるには、Excelを再起動しなければならない場合があります。)
変数を宣言しなければ、エラーが表示されます。
変数の初期化と代入
変数を宣言、定義したあとは値を初期化したり、代入する必要があります。
次のように記述します。
Dim 変数名 As データ型名 変数名 = 値
VBAは「:」(コロン)を使うと複数行を1行にすることもできます。
これを使って宣言と定義、初期化を1行で書くこともできます。
Dim 変数名 As データ型名: 変数名 = 値
なお、変数を定義すると変数には次のように初期値が格納されます。
- 数値系のデータ型:0(ゼロ)
- 文字列型:””(空文字)
- ブーリアン型:False(偽)
- オブジェクト型:Nothing
- バリアント型:Empty
このようにデータ型を定義すると初期化しなくても初期値が指定されますが、読みやすさなどを考えると初期化して明示することをオススメします。
初期化のあとは下記のように代入すれば、変数の値は変更可能です。
変数名 = 値
オブジェクト型についてはSetステートメントを使って以下のように初期化、代入する必要があります。
Dim オブジェクト名 As Object Set オブジェクト名 = オブジェクト
それではここまでの内容をサンプルコードで確認していきましょう。
Sub macro1() ' 変数の宣言と定義 Dim i As Integer, str As String, dt As Date ' 変数の初期化 i = 2016 str = "Excel" dt = Now MsgBox dt & vbCrLf & str & " " & i, vbInformation End Sub
実行結果:
このサンプルコードではInteger型の変数iとString型変数strとDate型変数dtを宣言、定義しています。そして「=」記号を使用してそれぞれの変数を初期化し、出力表示しています。
オブジェクト型やオブジェクト型の代入については、こちらのサイトで詳しく解説しています。
ぜひ参考にしてください
変数に配列を指定する方法
変数には配列を指定することもできます。
配列は下記のように変数名の後ろに「()」を付けて宣言します。
Dim 配列名() As 要素のデータ型名
「()」内には数値を指定することもできて、要素数を指定することができます。
Dim 配列名(要素数 - 1) As 要素のデータ型名
指定する要素数は必要な数から1マイナスした数になります。
それではサンプルコードで確認してみましょう。
Sub macro2() ' 配列の宣言と定義 Dim arr(3) As Integer ' 配列の要素の初期化 Dim i As Integer Dim str As String For i = LBound(arr) To UBound(arr) arr(i) = i str = str & arr(i) & vbCrLf Next i MsgBox str, vbInformation End Sub
実行結果:
このサンプルコードでは、Integer型の配列arrを宣言、定義しています。arr(3)と記述していますので、要素数は4となります。
そして、各要素をFor文を使って初期化しています。なお、サンプルコードでは配列の要素数を調べるためにLBound関数とUBound関数を使用しています。
LBound関数は引数に指定した配列で使用できる最も小さいインデックス番号を返します。UBound関数は引数に指定した配列で使用できる最も大きいインデックス番号を返します。
配列の使い方、LBound、UBoundの使い方についても、こちらのサイトで詳しく解説しています。
ぜひ参考にしてください。
変数のスコープについて
変数は宣言によって使える場所が限られます。これを変数のスコープ(適用範囲)といいます。
SubプロシージャやFunctionプロシージャなどのプロシージャ内で使える宣言なのか、それよりも大きいモジュール内で使える宣言などがあります。
ちなみにこれまでお伝えしてきた変数はすべてプロシージャ内で宣言されていました。プロシージャ内で宣言された変数は宣言したプロシージャ内でしか使用できません。
このような変数をプロシージャレベル変数といいます。これに対してモジュール内で宣言されているが、どのプロシージャ内にも含まれていない変数をモジュールレベル変数といいます。
モジュールレベル変数の記述例:
Dim モジュールレベル変数名 As データ型名 Sub macro1() End Sub Sub macro2() End Sub
モジュールレベルの変数はそのモジュール内のどのプロシージャからも使用することができます。
ただし、ほかのモジュールから使用することができません。ほかのモジュールでも使用できる変数はPublicステートメントを使って宣言します。
この変数をパブリック変数といいます。
パブリック変数の記述例:
Public パブリック変数名 As データ型名 Sub macro1() End Sub Sub macro2() End Sub
モジュールレベル変数やパブリック変数は使える範囲が広いため便利ですが、その分多くのプロシージャやモジュールから意図せず値を変更される危険性やバグを生む原因にもなります。
本当に変数を共有しなければならない場合だけ使うことをオススメします。
VBAの将来性
このように思っている人は多いでしょう。
VBAの用途はさまざまで、
- VBAのスキルがあれば転職できるのでは?
- 業務効率化のスキルは需要が高そうだから
などが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。ただ、VBAを扱えることが強みになるかといわれると、すこし疑問があります。
VBAは基本的にエクセル上でしか使用することができません。しかし、最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。
そうなってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。そう考えると将来的にVBAの需要はあまり高くないといえます。
ではVBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。
まとめ
ここでは、変数について説明しました。
変数の宣言やデータ型の定義、データ型の種類、値の初期化・代入の方法などについてお伝えしてきました。そのほかにも配列型の宣言・定義・初期化、変数のスコープについてもお伝えしました。
変数を使いこなせるとVBAをより広い範囲で使っていくことができるようになるので、使いこなすことができるようにこの記事を何度も参考にして下さいね!