VBAを記述していくうえで変数は必ず必要になります。
変数とは何か、なぜ変数が必要なのか、どのように変数を扱うのかについて理解できる記事となります。
変数の型については「LongやString、変数のデータ型と型の指定方法」をご覧下さい。
変数とは?
「変数」とはVBAに限らず、プログラミング言語で頻繁に使われます。
変数とは簡単に言うと、中学生の時に習う「y=ax+b」のyやxの様なものです。
変化する数字や文字を一時的に格納するための入れ物といったイメージです。
この変数を利用する事で、プログラムは色々な事を実装する事が可能になります。
変数が必要な理由
なぜ、わざわざ変化する数字や文字を、「変数」に格納する必要があるのかについてです。
簡単な例えで説明したいと思います。
例えば、次のような数式があったとします。
1+1=? 答えは2
1+2=? 答えは3
1+3=? 答えは4
もしこれが「1+100=?」や「1+1000=?」まで続くと考えると、書くのが大変ですよね。
プログラムでは×10万などが普通にありますので、大変どころではありません。
そこで変数を使います。
変数の中に足し算したい1~1000を順番に格納していきます。
「i=1〜1000」のように「i」という変数の中に1~1000を順番に格納していきます。
iの中身が1〜1000まで変化して、計算を順番に行ってくれます。
非常に書くのが楽になりますよね。
より実践的な例だと、毎日、毎月データの行数が変わるデータを操作しようとすると、データ数を変数に格納する事で、毎回行数を書き換えずに済みます。
このように、変化する数字や文字を変数に格納する事で、コードを簡略化出来ます。
汎用性の高いプログラムを作る上で、必ず必要となります。
変数の使い方
変数の宣言
変数は使用する際に、この文字は変数ですよと宣言する必要があります。
さらには「この変数は文字だよ」、「この変数は数字だよ」や「この変数は日付だよ」などと明示してあげます。
これを変数の宣言と言います。
この変数の宣言をするときに使用するのが、「Dim 」や「Public」です。
変数の宣言の書き方は「Dim 変数名 as 型」や「Public 変数名 as 型」と記述します。
「Dim」や「Public」等、書く場所や宣言方法によって、その変数の適用範囲が変わります。
変数の適用範囲
変数には宣言の仕方によって、変数が適用される範囲があります。
適用される範囲とは、VBAには「モジュール」や「プロシージャ」といった階層のようになっています。
変数の宣言によって、「この変数はプロシージャ内でのみ使えます」「この変数はモジュール内のプロシージャ全てで使えます」と、適用される範囲が変わります。
モジュールとプロシージャ
モジュール、プロシージとは何かについてです。
「モジュール」とは「プロシージャ」を書き込む1ページのエディタ(メモ帳のようなもの)です。
「プロシージャ」とは、「Sub プロシージャ名 ()」~「End Sub」 を1つの単位としてプロシージャと言います。
1つ1つのプログラムのパーツのようなもので、実行するとプロシージャ名以後に書かれたVBAが、End Subまで実行されます。
1つのモジュールには、上限はありますが何個もプロシージャを書くことが出来ます。
モジュールの種類
モジュールにはいくつか種類があります。
赤線で囲われた部分のSheet1(Sheet1)~Sheet3(Sheet3)をシートモジュールと言います。
主に各ワークシートに対するイベントを記載するモジュールです。
青線で囲われた部分のThisWorkbookと書かれているのがブックモジュールを言います。
こちらはブックに対するイベントを記載するモジュールとなります。
これらのモジュールはそれぞれのシートやブックに関連付いたモジュールになります。
最後に緑線で囲われた、「標準モジュール」のModule1はシートやブックに関連付いていないモジュールです。
基本的なコードは標準モジュールに、書いていくことになります。
変数の記述方法と適用範囲
変数の記述方法
変数にはたくさんの種類と記述方法がありますが、ここでは基本的な内容のみ触れておきます。
変数を以下のように記述します。
Dim 変数名 As Variant
Public 変数名 As Variant
変数名の前に「Dim」や「Public」をつけて、「変数名 As データ型」と記述します。
変数名は任意です。
今回使った「Variant」という型はデータは何でもOKという型になります。
適用範囲
プロシージャ内でのみ使える宣言
プロシージャ内に宣言します。
Sub プロシージャ名()~End Subの中に記述します。
また、先頭にDimを使います。※Dim以外にもありますがここでは割愛します。
以下コードはプロシージャ内で変数を宣言し、変数の中に文字列を格納して、メッセージとして表示させます。
プロシージャ内のみ適用されるため、End Sub以後には変数に入れた内容は破棄されます。
Sub Sample1()
Dim myStr As String'Stringは「文字列」型です。
myStr = "おはようございます!"'変数に""内の文字を代入してます。
MsgBox myStr'変数に代入された"おはようございます!"が表示されます。
End Sub
モジュール内に適用される宣言
モジュール内の一番上のプロシージャより上に宣言します。
どういうことかと言うと、モジュールにはたくさんのSub~() End Subのプロシージャを記述することが出来ますので、
一番上のSub~()よりもさらに上に記述するということです。
これにより、モジュール内に記載されているプロシージャ全てに適用されます。
Sample1がEnd Subで終わっても、Sample2を実行すると変数の中身が保持されておりメッセージとして表示されます。
'Module1に記載しています。
Dim myStr As String'モジュール内の一番上のプロシージャより上に宣言してます。
Sub Sample1()
myStr = "おはようございます!"
MsgBox myStr
End Sub
Sub Sample2()
MsgBox myStr
End Sub
すべてのモジュールに適用される宣言
最後に、すべてのモジュールに適用される宣言です。
モジュールもプロジェクト内にいくつも作成することができます。
こちらもモジュール内の一番上に書かれているプロシージャより上に宣言します。
どのモジュールに記述しても構いません。
ただし、いろんなモジュールに記述しすぎると、可読性が落ちますのでルールを作って記述と良いと思います。
先ほどのDimと違うところが「Public」を使用することです。
'Module1に記載しています。
Public myStr As String
Sub Sample1()
myStr = "おはようございます!"
MsgBox myStr
End Sub
Sub Sample2()
MsgBox myStr 'Module1でPublicで宣言した変数が適用されています。
End Sub
'Module2に記載しています。
Sub Sample3()
MsgBox myStr 'Module1でPublicで宣言した変数が適用されています。
End Sub
このように記載することでモジュールを超えて適用されます。
それぞれのコードをコピーしてご自身の環境でそれぞれModule1と2に貼り付けて
実行してもらえると、適用されていることが確認できるかと思います。
※変数への代入はあくまでSample1で行われいますので、Sample1を実行してから
Sample2、3を実行してください。
適用範囲の注意事項
Public変数やモジュール変数は使い勝手がよく、意識しなければ使用頻度が高くなってしまいます。
変数の数が増えたり、使用頻度が高くなり、さらにモジュールやプロシージャが増えた時に、変数の管理が非常に難しくなります。
管理が難しくなると、意図しない挙動が発生したり、予期しないエラーが発生しやすくなります。
管理が難しくなると、可読性も落ちますので適用範囲を決める際はここらへんも意識してみてください。