今回は変数について紹介します。VBAプログラムを作っていく上で必須ですが、これを理解するのが少々難しく、つまずく人は多いようです。これが理解できればVBAの世界が一気に広がりますのでぜひマスターしてください。
エクセルVBA-変数
変数とはいろいろなものを入れる箱のようなもので、入れたものを好きな時に取り出して使うことができます。入れる箱には種類があり、どんなものをいれるかによって箱を決める必要があります。この入れる箱の種類のことをVBAではデータ型と呼んでいます。変数が使えると具体的にどんなことができるようになるかは一番下の【変数を使ったループ処理の例】をご覧ください。
目次
データ型
まずはデータ型について表にまとめました。
まず覚えてほしいデータ型
データ型 | 名称 | 格納できるもの |
Long | 長整数型 | -2,147,483,648から2,147,483,647までの整数 |
String | 文字列型 | 最大で約20億文字まで |
その他のデータ型
データ型 | 名称 | 格納できるもの |
Boolean | ブール型 | True(真)かFalse(偽) |
Byte | バイト型 | 単一で署名のない8ビット(1バイト)の 0から255の範囲の数 |
Currency | 通貨型 | -922,337,203,685,477.5808 から 922,337,203,685,477.5807の範囲 |
Date | 日付型 | 西暦100年1月1日から 西暦9999年12月31日までの日付と時刻 |
Double | 倍精度浮動小数点型 | -1.79769313486231E308から -4.94065645841247E-324(負の値)と 4.94065645841247E-324から 1.79769313486232E308(正の値) |
Integer | 整数型 | -32,768 から 32,767までの整数 |
LongLong | LongLong整数型 | -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807までの整数 ※64ビット プラットフォームのみ有効 |
Object | オブジェクト型 | オブジェクトを参照 |
Single | 単精度浮動小数点型 | -3.402823E38 から -1.401298E-45 (負の値) 1.401298E-45 から 3.402823E38 (正の値) |
Valiant | バリアント型 | 全てのデータ |
まずは2つの変数LongとStringを覚えてください。これを覚えれば結構なVBAが作れます。その他のデータ型についてはこういう型があるということを覚えていればOKです。バリアント型は何でも格納できる便利なデータ型なのですが、多用するのはあまりおすすめしません。変数の基本的な考え方が身に付かないし、予期せぬエラーの原因にもなり、修正に手間がかかる要因にもなります。
変数の使い方
変数の宣言
まずは変数の宣言をします。変数の宣言とは『この箱にこういう種類のものを入れます』と最初に記述することを言います。
サンプルコード
Sub DimTest1()
Dim i As Long '長整数型(Long)の値をiという箱に格納する宣言記述です
End Sub
基本は【Dim 変数名 As データ型】という形になり、Dimのことをステートメントと言います。変数の宣言はしなくても問題ないですが、複数の変数を使うようになると、後々この変数には何を入れていたのかが分かりにくくなるため、必ず宣言をすることをおすすめします。VBEの設定で【変数の宣言を強制する】という設定ができ、これを設定すると宣言なしでは変数が使用できないようになるので設定するようにしましょう。
変数の適用範囲(スコープ)
先程はDimステートメントを使った基本の宣言を記述しましたが、記述する場所や違う種類のステートメントを使うことによって、宣言した変数が使用できる範囲が変わります。簡単な表を作成しましたので確認してください。基本的にはDimとPublicが理解できれば問題ありません。
ステートメント | 宣言場所 | 適用範囲 |
Dim | プロシージャの中 | 宣言を記述したプロシージャ内のみで使用可能 |
モジュールの先頭 (プロシージャの外) |
宣言を記述したモジュール内にある 全てのプロシージャで使用可能 |
|
private | モジュールの先頭 (プロシージャの外) |
宣言を記述したモジュール内にある 全てのプロシージャで使用可能 |
Public | プロジェクト内のいずれかのモジュールの先頭 (プロシージャの外) |
宣言を記述したプロジェクトにある 全てのモジュールの 全てのプロシージャで使用可能 |
Static | プロシージャの中 | 宣言を記述したプロシージャ内のみで使用可能 Dimとの違いはプロシージャ終了後も値を保持する 下記のいずれかを実行すると値はクリアされる ①新規プロシージャを作成する ②VBEのリセットボタンを押す ③Endステートメントを実行する |
ポイント
プロシージャとは・・・Sub~End Subまでのプログラムの塊のこと(通常のエクセルで言うとセルにあたるイメージ)
1つのプロシージャ内のみで使用可能な変数のことプロシージャレベル変数と言います。
モジュールとは・・・プロシージャが記述されているシート全体のこと(通常のエクセルで言うとワークシートにあたるイメージ)
1つのモジュール内の全てのプロシージャで使用可能な変数のことをモジュールレベル変数と言います。
プロジェクトとは・・・全てのモジュールが格納されている大本(通常のエクセルで言うとワークブックにあたるイメージ)
1つのプロジェクト内ならどこでも使用可能な変数のことをパブリックレベル変数と言います。
変数の使用例
それでは実際に変数を使って簡単なコードを書いてみましょう。
プロシージャレベル変数
サンプルコード
Sub variableTest1()
Dim i As Long 'iという入物に数値を入れますという宣言
i = 1 'iに1を入れます
Cells(i, 1) = i '①
i = i + 1 '②
Cells(i, 1) = i '③
End Sub
①ではiに1が入るので、Cells(1,1)=1となりセルA1に1が入力されます。
②の式が少し難しいかもしれませんが、=を『等しい』と考えるのではなく『右の値に置き換える』という風に考えてください。i = i + 1 という式は『i + 1 の値を i に入れる』という意味になり、これ以降の i の中身は2に変わります。
③ではiに2が入るので、Cells(2,1)=2となりセルA2に2が入力されます。
この場合の変数 i は【variableTest1】というSubプロシージャの中だけで使用ができる変数となります。
モジュールレベル変数
サンプルコード
Dim i As Long 'iという入物に数値を入れますという宣言(モジュールの一番上に書く)
Sub variableTest2()
i = 1 'iに1を入れます
Cells(i, 1) = i '①
i = i + 1 '②
Call variableTest3'③
End Sub
Sub variableTest3()
Cells(i, 1) = i '④
End Sub
①ではiに1が入るので、Cells(1,1)=1となりセルA1に1が入力されます。
②の式でこれ以降の i の中身は2に変わります。
③のCallというのは別のプロシージャを呼び出すステートメントで、ここでは下にある【variableTest3】を呼び出し、そこに移動します。
④では②で変化した中身が使用されるので、iは2となりCells(2,1)=2という式になります。つまりセルA2に2が入力されます。
この場合の変数 i は同じモジュール内であればどのプロシージャでも使用できる変数となります。
パブリックレベル変数
今度は別々のモジュールにあるプロシージャ間で変数を使用します。下記のようにModule1とModule2にあるプロシージャ間で変数iを使用してみます。
Module1コード
Public i As Long 'iという入物に数値を入れますという宣言(モジュールの一番上に書く)
Sub variableTest2()
i = 1 'iに1を入れます
Cells(i, 1) = i '①
i = i + 1 '②
Call Module2.variableTest3'③
End Sub
Module2コード
Sub variableTest3()
Cells(i, 1) = i '④
End Sub
①ではiに1が入るので、Cells(1,1)=1となりセルA1に1が入力されます。
②の式でこれ以降の i の中身は2に変わります。
③のCallで、Module2にある【variableTest3】を呼び出し、そこに移動します。
④では②で変化した中身が使用されるので、iは2となりCells(2,1)=2という式になります。つまりセルA2に2が入力されます。
この場合の変数 i は同じプロジェクト内であればどのモジュールのどのプロシージャでも使用できる変数となります。
変数を使ったループ処理の例
ここでちょっとしたループ処理を使い、変数の具体的な利用例を簡単に紹介します。ループ処理の詳細については別でご紹介します。
サンプルコード
Sub variableTest1()
Dim i As Long 'iという入物に数値を入れますという宣言
i = 1 'iに1を入れます
Do Until i = 100 '①
Cells(i, 1) = i '②
i = i + 1 '③
Loop '④
End Sub
Do Loop というループ処理で、動作する順番は①→②→③→④→①→②・・・・・とループします。
①で使用しているUntilは~になったら処理を終了するという条件。ここではiが100になったらループ処理を終了するという意味になります。それまでは処理を繰り返します。
②は先程までと同様。最初はiは1なのでセルA1に1が入力されます。
③でiが2に変わります。
④はここでループ処理が終了の合図なので、①へ戻る。この時にiが100に等しいかどうかをチェックして、100であればループ処理を終了します。この時点でiは2のためループ処理は続行されます。
2回目の処理に入り、②のiには2が入るためセルA2に2が入力され、③でiが3に変わります。そしてまた①へ戻り、iが100になるまで処理を繰り返します。
つまりこのプロシージャを実行するとセルA1~セルA99に1~99の連番が入力されます。②の内容を変えればいろんなことができるようになります。
まとめ
プログラムにおいて変数というのは非常に重要で、これなしでプログラムを作成することは困難です。最後に紹介したループ処理の例をみていただければわかるかと思いますが、もし変数を使用せずに同じことをやろうとすると、99行の構文を手入力するしかありません。これが何十万行ともなると気が遠くなるでしょう。変数とループ処理を合わせれば、何十万でも何百万でも、終了条件を変更するだけで簡単に対応することが可能となります。ぜひマスターして応用しましょう。
新着記事