今回は、VBAをネットで調べた時に、サンプルコードで必ずと言っていいほど、目にする「Dim ○○ as 〜」とか「Public ○○ as 〜」 についてご説明します。
ここら辺は、初心者の方や慣れていない方は混乱しやすい箇所になるかと思いますので、出来るだけわかりやすく記載してみます。
変数の型については「LongやString、変数のデータ型と型の指定方法」をご覧下さい。
1.変数とは?
タイトルにもある、「変数」とはVBAに限らず、プログラミング言語で頻繁に使われます。
変数とは簡単に言うと、中学生の時に習う「y=ax+b」のyやxの様なものです。
変化する数字や文字を一時的に格納するための入れ物といったイメージです。
この変数を利用する事で、プログラムは色々な事を実装する事が可能になります。
2.変数が必要な理由
なぜ、わざわざ変化する数字や文字を、「変数」に格納する必要があるのでしょうか。
プログラミング自体をこれから学習する方にはイメージが難しいかもしれません。
簡単な例えで説明したいと思います。
例えば、次のような数式があったとします。
1+1=? 答えは2
1+2=? 答えは3
1+3=? 答えは4
もしこれが1+100=?まで続くとしたら・・・。
1+1000=?だとしたら・・・、書くのが大変ですよね。
プログラムでは×10万などが普通にありますので、大変どころではありません。
そこで変数を使います。
「i=1〜1000」ループするという命令を書くと
1+i=?
でiの中身が1〜1000まで変化します。
非常に書くのが楽になりますよね。
より実践的な例だと、毎日、毎月データの行数が変わるデータを操作しようとすると、データ数を変数に格納する事で、毎回行数を書き換えずに済みます。
このように、変化する数字や文字を変数に格納する事で、コードを簡略化出来ます。
汎用性の高いプログラムを作る上で、必ず必要となります。
3.変数の宣言とは?
変数は使用する際に、「この変数は文字だよ」、「この変数は数字だよ」や「この変数は日付だよ」などと明示してあげます。
これを変数の宣言と言います。
この変数の宣言をするときに使用するのが、「Dim 」や「Public」です。
変数の宣言の書き方は「Dim 変数名 as 型」や「Public 変数名 as 型」です。
「Dim」や「Public」等、書く場所や宣言方法によって、その変数の適用範囲が変わります。
変数の適用範囲について説明する前に、プロシージャやモジュールについて簡単にですが説明したいと思います。
4.プロシージャとモジュール
変数の適用範囲とは、「この変数はプロシージャ内でのみ使えます!」「この変数はモジュール内のプロシージャ全てで使えます!」といったことです。
変数の適用範囲の説明の前に、赤線の引いているプロシージャとモジュールについて、簡単に説明したいと思います。
「プロシージャ」とは、「VBAを書いてみる」の3でも説明していますが、
「Sub プロシージャ名 ()」~「End Sub」 を1つの単位としてプロシージャと言います。
「モジュール」とは「プロシージャ」を書き込むエディタ(メモ帳のようなもの)です。
1つのモジュールには、上限はありますが何個もプロシージャを書くことが出来ます。
また、このモジュールにはいくつか種類がありますが、ここでは簡単な説明だけとさせていただきます。

赤線で囲われた部分のSheet1(Sheet1)~Sheet3(Sheet3)をシートモジュールと言います。
主に各ワークシートに対するイベントを記載するモジュールです。
青線で囲われた部分のThisWorkbookと書かれているのがブックモジュールを言います。
こちらはブックに対するイベントを記載するモジュールとなります。
これらのモジュールはそれぞれのシートやブックに関連付いたモジュールになります。
最後に緑線で囲われた、「標準モジュール」のModule1はシートやブックに関連付いていないモジュールです。
基本的なコードと言いますか、大半のコードは標準モジュールに、書いていくことになります。
5.変数の適用範囲
Dim~プロシージャ内でのみ使える宣言
プロシージャ内でのみ使える宣言はプロシージャ内に宣言します。
Sub Sample1()
Dim myStr As String'Stringは「文字列」型です。
myStr = "おはようございます!"'変数に""内の文字を代入してます。
MsgBox myStr'変数に代入された"おはようございます!"が表示されます。
End Sub
Dim~ モジュール内に適用される宣言
モジュール内に適用される宣言はモジュール内の一番上のプロシージャより上に宣言します。
これにより、モジュール内に記載されているプロシージャ全てに適用されます。
'Module1に記載しています。
Dim myStr As String'モジュール内の一番上のプロシージャより上に宣言してます。
Sub Sample1()
myStr = "おはようございます!"
MsgBox myStr
End Sub
Sub Sample2()
MsgBox myStr
End Sub
Public~ すべてのモジュールに適用される宣言
最後に、すべてのモジュールに適用される宣言です。
こちらもモジュール内の一番上に書かれているプロシージャより上に宣言します。
先ほどの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を実行してください。
6.適用範囲の注意事項
Public変数やモジュール変数は使い勝手がよく、意識しなければ使用頻度が高くなってしまいます。
また、変数の数が増えたり、使用頻度が高くなり、さらにモジュールやプロシージャが増えた時に、変数の管理が非常に難しくなります。
管理が難しくなると、意図しない挙動が発生したり、予期しないエラーが発生しやすくなります。
管理が難しくなると、可読性も落ちますので適用範囲を決める際はここらへんも意識してみてください。