変数はある状態を記憶してほかの目的でも何度も使えるようにするものです。
あるシートを操作していて、ほかのシートを使った後にもう一度最初に操作していたシートを操作したいという時に、最初のシートはこれと記憶しておくことによってはじめて最初に捜査していたシートに戻ることができるのです。
また繰り返し処理をしている時は、繰り返し回数を管理する場合がありますが、そのようなときにも繰り返し回数の数値はどんどん増えて変わっていくので変数に入れて管理するのです。
プログラムでは変数を使うのが一般的です。シンプルなプログラムであれば使わないこともありますが変数を使わないより使った方がより高度なことができます。
変数の代入と参照
変数にある値を入れることを「代入」、変数の内容を読み出すことを「参照」と呼びます。
変数aの値を1増やすVBAは「a=a+1」ですが、この数式は数学的には全くおかしいのですが、プログラムではよくこのような書き方をします。左辺と右辺があって、プログラムでは、左辺を右辺の値にセットすると訳します。左辺と右辺で分けて矢印を付け「a←a+1」と考えるとわかりやすくなります。「a=a+1」は、「変数aを参照してその値に1を足したものを変数aに代入する」という意味です。
シートやブックはいろいろな要素が内包されている「モノ」なので、オブジェクトと呼びます。このオブジェクトを変数に格納するときは、代入の計算式だけではなく、その前に「Set」が必要で「Set sh=ActiveSheet」のような書き方をすれば変数shに今操作しているシートを代入でき、別のシートを操作するVBAのあとに「sh.Select」でそのシートに戻ってくることができます。
変数の宣言
変数にはデータの形があります。はじめに変数の名前と変数の形をこういうものを使うと記述することを宣言と呼びます。
場合によっては変数の宣言をしなくても動作するVBAを作成することができますが、宣言をすることでVBAに私たちの意図がより明確に伝わるので予想外の動作をすることを防いだり、VBA作成時にアシストしてくれたりするので宣言は行うべきものと考えられています。
変数のスコープ種類
変数にはそれぞれ影響範囲によってスコープの種類が違います。
変数の種類を捉えるには、モジュールとプロシージャいう考え方の知識が必要です。
Aには、全体を表すVBA Projectがあり、これは1つのブックともいえます。その中にはシートそれぞれで何かの動きがあったときに動作するVBA、ブックで何かの動きがあったときに操作するVBA、そのほか一般的な動作のVBAを記載するモジュールがあります。ほとんどの場合、VBAは標準のモジュールに記載しますが、モジュールは1つだけではなく、複数のモジュールをプロジェクトの中に入れることができます。
モジュールは右クリックするとエクスポートして他のパソコンで読み出せるようにできます。そのような管理をするために分けることもあるでしょうし、はじめてマクロの記録をするとモジュールが新しく作成され、Excelをいったん終了しもう一度起動してマクロの記録をすると新しいモジュールが作成されます。また、次の説明のように変数を管理したいときにもわざと分けることもあります。
プロシージャは一つのSubからEnd Subまでを指します。マクロの表示で表示されるマクロ名の単位と言ってもいいかもしれません。プロシージャのすごいところはプロシージャから他のプロシージャを読み出せることです。用紙をA4判横にして印刷をするだけのプロシージャがあって、次々とシートを選択するプロシージャから用紙設定を変更し印刷するプロシージャを呼び出せば、一回一回に長々と用紙設定と印刷のプロセスをVBAに書く必要がなく、また、用紙をB5判に変更したいときには変更は1か所だけで済むようになります。一つのモジュールの中には複数のプロシージャを書くことができます。またプロシージャにはSubではなく、Functionで始まりEnd Functionで終わるものもあります。Functionは自分でワークシート関数を作ることができます。作ったワークシート関数はVBAの中でも使える関数になります。
このようにモジュールとプロシージャがあって、変数はそのそれぞれで使う時の種類が違います。
変数の種類は大きく分けると2通りで複数のプロシージャで共用もできるグローバル変数と、1つのプロシージャのみ使えるローカル変数があります。
グローバル変数には1つのモジュールの中でのみ共用できるモジュールレベル変数と、1回だけ宣言すれば複数のモジュールに渡って共用できるパブリック変数があります。
ローカル変数では、そのプロシージャが他のプロシージャから呼び出された後にその処理が終了したら消えてしまう純粋なローカル変数と、そのプロシージャが再度呼び出されたときでも値が保存されて値を参照できる静的変数の2通りがあります。
純粋なローカル変数以外はマクロの動作が終わっても値を保持します。
グローバル変数
グローバル変数は複数のプロシージャの間でやり取りができる変数です。マクロの実行を終了しても値は残ります。
マクロの実行回数を数えたり、直前に操作したマクロが何か特定できるような印を残したりするのに使えます。
グローバル変数にはモジュールレベル変数とパブリック変数があります。
モジュールレベル変数
モジュールは1つのプロジェクトにいくつも追加することができますが、1つのモジュールの中だけで使え、マクロの実行が終了しても値が残ります。
1つのプロシージャの外に1か所Dim、またはPrivateで宣言しておくことで1つのモジュールの中で使用することができます。
1つのモジュールの中だけでしか使えないのは不便に感じるかもしれませんが、他のモジュールで同じ変数名を使っていても衝突することはないので、気にせずに変数名を設定できるメリットがあります。
パブリック変数
1つのプロジェクトの中のすべてのモジュールのプロシージャで共用できる、マクロの実行が終了しても値が残る変数です。
プロシージャの外に1回Publicで宣言します。
プロジェクト全体で名前の重複には十分気を付ける必要があります。売上、売上数、売上個数、売上金額のように同じ売上を管理する変数がたくさんあると間違いが起きやすくなります。十分に気を付けましょう。
ローカル変数
ローカル変数は1つのプロシージャの中でしか使えません。宣言しておけば他のプロシージャで使っていてもそのプロシージャ内でしか使えないので変数名の重複は気にしなくてもよいです。変数を他のプロシージャでも使いたい場合はグローバル変数を使いましょう。
ローカル変数
ローカル変数に分類される純粋なローカル変数で、そのプロシージャの実行が終わるとローカル変数は消えます。新たにプロシージャを呼び出すときに再度作成されます。
変数を宣言しない場合はこの純然たるローカル変数になります。
プロシージャ内でDimに続き変数名を宣言します。
静的変数
静的変数はStatic変数とも呼ばれます。ローカル変数の一種なのでそのプロシージャでしか使えませんが、そのプロシージャが実行されても消えずに値は残っています。つまり静的変数は宣言した静的変数からしかアクセスできないのが特徴です。
プロシージャ内でStaticに続き変数名を宣言します。
モジュールレベル変数とあまり変わらない動作なので、消えない変数にしたいが、よほどその変数にアクセスさせたくないときに使うかなというくらいの使用率です。
変数の型
変数には形があります。
文字を入れることができる文字型、数値を入れる数値型、小数点型、日付や時刻を入れられる型、シートやブック、セル範囲を示すオブジェクト型などです。
VBAでは数値型で-3万から+3万までの整数を扱うInteger型、それ以上の大きな整数を扱うLong形、小数点の数値を扱えるDouble型、文字データのString型、セル範囲のRange型、シートのWorksheet型、ブックのWorkbook型くらいを覚えておけばいいでしょう。
変数の種類は2つの考え方があります。スコープ範囲の種類とデータ型の種類です。
変数を宣言するときは、「スコープの種類 変数名 As データ型」と指定します。
プロシージャの外に「Dim wsh As Worksheet」と記載したら、それはその記載したモジュールのプロシージャすべてで共用できるワークシートを格納する変数ということになります。
コメント