セルの値や計算結果を一時的に格納する入れ物(箱)として使われ、マクロ記述には欠かせないものです。通常、変数を使うときは変数の宣言と変数の名前に注意しなければなりません。変数の宣言とは、あらかじめ使う変数が数字なのか文字列なのかなど「データ型」を指定することです。これによって間違った変数を使わないようにできます。変数の名前を付けるのにアルファベット、漢字、かなは使えますが、記号やオブジェクト、プロパティなどの用語は使用できません。
変数宣言はDimステートメントで行います。
Dim 変数名 As データ型
上記の例では、まず「セル値」という名前の箱を用意し、その中には文字列を入れることを宣言しています。次に、選択されているセルの値を「セル値」の箱に入れます。仮に、選択されたセルの値が「100」であると、メッセージとして「このセルの値は100です」と表示されます。変数のデータ型には以下のようなものがあります。
データ型 | 内容 |
---|---|
Integer | 変数が整数であることを示します。この宣言をしておくと、間違って変数に文字列を設定したり、小数点以下の数値が設定されると、実行時にエラーが表示されます。変数宣言は、誤った値が変数に入ることを未然に防ぐ効果があります。 |
Long | 変数が長整数であることを示しますが、これはIntegerより大きい値を扱うことができます。変数とは誤った変数を使えないようにするだけではなく、変数に使用するメモリ領域をあらかじめ設定しておく意味もあります。Integerは2バイト、Longは4バイトのメモリを使用します。 |
Single | 小数点を含む数値を扱うデータ型です。使用メモリは4バイトです。一般的な小数点使用であればSingleで十分ですが、それ以上ならDoubleを使用します。 |
Currency | 通貨型のデータ型です。Longよりも大きな値を使え、小数点を含む値も使えます。割り当てられる使用メモリは8バイトです。 |
String | 文字列を示します。漢字、ひらがな、カタカナ、英字、数字、記号、スペース、句読点を含む文字列を扱えます。数字も扱えますが、計算に扱うのであればInteger、Longを使います。 |
Variant | 数値や文字列のほか、日付などあらゆる種類の変数に対応します。もし、データ型を指定しなければ、自動的にValiant型になります。使用メモリは22バイト+文字列分。そのほか、データ型には変数がオブジェクトであることを示すオブジェクト型があり、この場合、As以下にRangeやWorksheetなどの特定のオブジェクトを指定できます。 |
変数を宣言しなくてもVBAの処理は実行できます。しかし、変数を多く利用したり、繰り返しの処理をする場合、処理の速度が遅くなったり、エラーが表示されることもあります。そこで、変数を使用するには必ず変数宣言を行うようにします。また、変数宣言を強制することができます。新規作成したモジュールの宣言セクションに「Option Explicitステートメント」を自動的に記述されるように設定をすれば、宣言していない変数は使えないようになります。
メニュー[ツール]を選択し[オプション]をクリックし、オプションダイアログボックスの[編集]タブで「変数の宣言を強制する」にチェックを入れます。
変数には変数を使える範囲となる有効範囲と変数に代入された値が保持される期間となる有効期間があります。これらは、変数を宣言する場所によって異なります。1つのプロシージャ内で宣言した変数はそのプロシージャ内でしか使えません。これをプロシージャレベル変数と呼びます。また、モジュールの宣言セクションで宣言した変数は、そのモジュール内のすべてのプロシージャで使えます。これをモジュールレベル変数と呼びます。
では、その違いを比較して見ます。次のプロシージャコードを入力してください。
これを実行すると、どちらも同じ数字が入力されますが、再度実行するとモジュールレベルの変数だけは数字が足された状態になります。これは、モジュールレベル変数は前回の値を保持しているためで、プロシージャレベル変数は前回の値を破棄したためです。
モジュールレベルの変数は実行を繰り返す度に、前回の値を保持しますが、Endステートメントを使えば値を破棄することができます。また、Endステートメントはプログラムそのものを終了させるので、プロシージャレベルの変数の値も破棄されます。
変数にはオブジェクトそのものを指定することができます。これをオブジェクト変数といい、オブジェクトと同じようにプロパティやメソッドが使用できます。簡単に言えば、オブジェクトに一時的な名前(変数)を付けるようなものです。
オブジェクト変数には2種類あります。まず、総称オブジェクト型変数というものがあり、あらゆる種類のオブジェクトへの参照を代入できます。そして、固有オブジェクト型変数というものは、特定のオブジェクトへの参照だけを代入できます。あらかじめオブジェクトの種類が分かっているのであれば、固有オブジェクト型変数を使用したほうが実行速度などの向上が望めます。
Dim 変数名 As Object
Dim 変数名 As 固有オブジェクト名
例えば、固有オブジェクト名をRange型で宣言するとオブジェクト変数にはRangeオブジェクトへの参照だけを代入できます。
通常は固有オブジェクト型変数を利用するようにします。では、その例を見ていきます。下のプロシージャを記述してみましょう。
Sub 固有オブジェクト変数()
Dim MyCell As Range
Set MyCell = Range("A1:A3")
MyCell.Interior.Color = RGB(255, 0, 0)
Set MyCell = Nothing
End Sub
Range型(固有オブジェクト型)のオブジェクト変数Mycellを宣言し、オブジェクト変数Mycellにセル範囲A1からA3への参照を代入しています。そして、オブジェクト変数の塗りつぶしの色を赤に設定し、最後にオブジェクト変数を初期化しているプロシージャとなっています。
上のプロシージャでは、Setステートメントを使用しています。これは、オブジェクト変数にオブジェクトへの参照するために使用するものです。
Set オブジェクト変数 = オブジェクト
また、オブジェクトへの参照を解除して、初期化するにはオブジェクト変数にNothingキーワードを代入します。通常はプロシージャが終了すると自動的にオブジェクトへの参照は解除されますが、明示的に解除するにはNothingキーワードを使用します。
Set オブジェクト変数 = Nothing
文字列や数値などの値に、名前を付けてプロシージャで使うことができます。これを定数と呼び、Constステートメントで宣言します。これを使うことで分かりやすく修正しやすいプロシージャを作成できます。
Const 変数名 As データ型 = 値
VBAでは同じデータ型の変数を複数利用することがあります。このような場合、配列変数を使います。では、配列の考え方を例えてみます。
整数型の配列変数を4つ用意するには以下のように記述します。
Dim X(3) As Integer
必要な変数の数を、配列変数の宣言時に記述すると1回の宣言で複数の変数を用意できます。このときに用意される配列変数はX(0)、X(1)、X(2)、X(3)の4つになります。配列変数は、配列の位置を指定するインデックス番号を()カッコの中に記述して指定します。このインデックスは必ず「0」から始まりますので、数える場合は注意をしてください。この配列変数を使うと、それぞれの値を順番に処理したり、複数の値を一度に処理できます。
Dim 変数名(要素数) As データ型
では、配列変数の例を見ていきましょう。以下のプロシージャコードを入力してください。