グローバル変数の使い方

中級VBA

はじめに

 変数は有効範囲を持っており、プロシージャ内で宣言された変数はプロシージャの内部でのみ有効となります。
 複数のプロシージャで共通の変数を使いたい場合、プロシージャの外部に変数を宣言する事によりプロシージャを終えた後でも値を保持する事ができるようになります。
 このような変数をグローバル変数と言います。

 グローバル変数も宣言の仕方によって利用できる範囲が限られます。この範囲の事をスコープと呼びます。
 どこからでも参照できるグローバル変数は一見便利に感じるかもしれませんが、あまり広範囲に設定してしまうと、どこからでも値を変更できてしまうため保守の観点からなるべく限定して使うのが良いとされています。
 
 ここでは、グローバル変数の使い方と有効範囲について紹介します。

変数の宣言

 ExcelVBAでは、変数を宣言せずに使う事ができる仕様になっています。
 ただ、どのような型の変数を使用するか宣言してから使う方が、思わぬエラーを起こさないためにも有効となります。

変数の宣言を強制する設定

 モジュールの先頭に、「Option Explicit」と宣言すると変数の宣言が必須となり、宣言せずに変数を利用しようとすると警告が出るようになります。
 Option Explicit を常に利用できるようにするには、VBEの「ツール」>「オプション」から「編集」タブの「変数の宣言を強制する」にチェックを入れておきます。
 ある程度プログラムに慣れている方はチェックを入れている場合が多いと思います。

宣言セクション

 変数の宣言は型だけでなく、Dim, Private, Public などの「宣言セクション」があり、宣言する変数の有効範囲を特定できます。

宣 言用 途
Dim宣言されたプロシージャ、モジュール内で有効。
Privateモジュールの先頭で宣言し、モジュール内で有効。
プロシージャ内では宣言不可。
Public標準モジュールの先頭で宣言しプロジェクト内のどこからでも参照可能。
プロシージャ内では宣言不可。

 Dim は、プロシージャ内で変数を宣言する際に利用され、プロシージャの先頭で宣言した場合は、そのモジュール内でグローバル変数として利用できます。
 プロシージャ内で変数を宣言する場合は、参照する前であればどこで宣言しても構いません。
 但し、プロシージャ外部で宣言する場合は、必ずモジュールの先頭で宣言しなければいけません。
 
 Private は、変数の有効範囲を限定的にします。有効範囲は宣言されたモジュール内で有効になります。
 こちらも、モジュールの先頭で宣言します。また、プロシージャ内では宣言できません。

 Public は、プロジェクト内のどこからも参照できるようになります。
 宣言に関しては、標準モジュールの先頭で行います。ThisWorkbookモジュールの先頭でも宣言できますが、他のモジュールで参照できないので無意味です。シートモジュールで宣言するとエラーとなります。

 尚、Private Public に関してはクラスで使用されます。意味合いは似ていますがクラス以外の使用方法とは異なります。
 クラスでの使用方法は、以下を参照してください。
 
 ・クラス

グローバル変数の参照範囲

 変数は、参照範囲を最小限にするように宣言するのがコツです。
 どこからでも参照できるグローバル変数は一見便利に感じるかもしれませんが、どこからでも値を変更できてしまうためエラーの原因となるため、なるべく限定して使うのが良いとされています。

 プロシージャの外部で宣言された変数と、プロシージャ内で宣言された変数の名前が重複する場合は、プロシージャ内で宣言された変数が使われます。ただ、エラーの原因となりやすいので、変数名の重複は避けるべきでしょう。

プロジェクト全体で参照したい場合

 プロジェクト内のどこからでも参照できるグローバル変数を利用したい場合は、標準モジュールの先頭に Public で変数を宣言しておきます。これで、他の標準モジュールシートモジュールThisWorkbookモジュールのどこからでもその変数を参照できます。

モジュール単位で参照したい場合

 標準モジュールシートモジュールThisWorkbookモジュールそれぞれの先頭で Private や Dim で変数を宣言します。ただ Private で宣言するのが一般的です。

まとめ

 グローバル変数は、モジュールの先頭で宣言しなければなりません。
 また、出来ればモジュール内のみで Private で宣言して使用するようにした方が良いでしょう。
 
 プロジェクト内全体で参照したい場合は、標準モジュールの先頭で Public として宣言します。
 変数名に関してはなるべくユニークなものを使用するようにして他の変数名と重複しないようにしましょう。

タイトルとURLをコピーしました