VBAを勉強していて、グローバル変数って何??と悩んだことはありませんか?
この記事では、エクセルVBAのグローバル変数の使い方について詳しく説明します。
基本的な使い方から、メリット・デメリット、注意点まで、初心者でもすぐに実践できる内容です。
ぜひ最後までお読みください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を見てできるようになること
この記事を読めば、以下のことができるようになります。
変数とは?
VBAにおける変数は、データを一時的に記憶するための箱のようなものです。
プログラム内でデータを扱う際に、変数を使うことでデータを柔軟に操作できます。
変数の基本についてもっと知りたい方は、以下の記事で詳しく解説しています。
こちらもぜひご覧ください。
VBAにおける各変数の違い
VBAには、さまざまな種類の変数があります。
以下に代表的な変数を紹介します。
本記事では、グローバル変数について詳しく解説します。
グローバル変数とは?
それでは、グローバル変数について解説を行います。
通常の変数とグローバル変数の違い
通常の変数は、特定のプロシージャ内でのみ使用される変数です。
一方、グローバル変数は、モジュール全体やプロジェクト全体で使用される変数です。
これにより、複数のプロシージャやモジュール間でデータを共有することができます。
種類 | 説明 | 適用範囲 (スコープ) | 有効期間 |
---|---|---|---|
通常の変数 | 特定のプロシージャ内でのみ 使用される変数。 | 宣言されたプロシージャ内 | プロシージャが 実行されている間のみ |
静的変数 | プロシージャが終了しても 値を保持する変数。 | 宣言された プロシージャ内 | プロシージャが 終了しても値が保持される |
グローバル変数 | モジュール全体やプロジェクト 全体で使用される変数。 | 宣言されたモジュール全体 またはプロジェクト全体 | モジュールを 閉じるまで |
スコープとは?
先ほど説明した通り、通常の変数とグローバル変数で、使用される範囲が異なります。
(そのことをスコープといいます)
スコープについて、さらに解説を行います。
次のような、コードがあるとします。
このコードを、「プロシージャ1」 ⇒ 「プロシージャ2」 ⇒ 「プロシージャ3」 と順番に実行した場合、どのようになるでしょうか?
- 「プロシージャ1」を実行した結果
- 「変数:Proc_1」は、「10」が格納されます。
- 「グローバル変数:Module_1」は、「100」が格納されます。
※「プロシージャ1」の処理が完了後は、以下の通りとなります。- 「グローバル変数:Module_1」は「100」を保持します。
- 「変数:Proc_1」に格納した「10」は値が破棄されます。
- 「プロシージャ2」を実行した結果
- 「変数:Proc_2」は、「20」が格納される。
- 「グローバル変数:Module_1」は、「200」に変更され格納される。
※「プロシージャ2」の処理が完了後は、以下の通りとなります。- 「グローバル変数:Module_1」は「200」を保持します。
- 「変数:Proc_2」に格納した「20」は値が破棄されます。
- 「プロシージャ3」を実行した結果
- 「グローバル変数:Module_1」は、「230」に変更され格納される。
※「プロシージャ2」の処理が完了後は、以下の通りとなります。- 「グローバル変数:Module_1」は「230」を保持します。
- 「グローバル変数:Module_1」は、「230」に変更され格納される。
このように、グローバル変数は、モジュール内の全てのプロシージャで使用することができます。
また、有効期間は、モジュールを閉じるまで値が保持されます。
グローバル変数の宣言方法
グローバル変数を宣言する際には、Publicステートメントを使用します。
通常の変数とは異なり、モジュールの先頭で宣言します。
宣言方法
グローバル変数の宣言方法は、以下の通りです。
【 使用例 】
Public Num As Long
このコードは、変数「Num」を長整数型のグローバル変数として宣言します。
グローバル変数を使用する場合の注意点
グローバル変数は便利ですが、管理が難しくなるため、適切な場面でのみ使用することをお勧めします。
※グローバル変数に値を格納するのではなく、セルに一旦転記するという方法も検討してみてください。
- グローバル変数の使用を最小限に抑える
- グローバル変数は、プログラム全体でアクセス可能であるため、便利に感じるかもしれません。
しかし、頻繁に使用するとプログラムの可読性が低下し、追跡が難しくなります。
⇒ できる限りローカル変数を使用し、グローバル変数は本当に必要な場合に限定して使用することを心がけましょう。
データの共有が必要な場合でも、可能であれば、ローカル変数やプロシージャ間の引数の受け渡しを使用することが推奨されます。
- グローバル変数は、プログラム全体でアクセス可能であるため、便利に感じるかもしれません。
- グローバル変数の競合リスクに注意する
- グローバル変数は、複数のプロシージャで同時にアクセスされる可能性があるため、意図しない競合が発生することがあります。
たとえば、1つのプロシージャが変数の値を変更している最中に、別のプロシージャがその変数を参照することで予期しない動作が起こることがあります。
⇒ グローバル変数にアクセスするタイミングを慎重に設計し、意図しない変更が加わらないようにプログラムを整理します。
また、必要に応じてロック機構を導入して、競合を防ぐようにします。
- グローバル変数は、複数のプロシージャで同時にアクセスされる可能性があるため、意図しない競合が発生することがあります。
- 3. 一貫した命名規則を導入する
- グローバル変数は、プログラムのあらゆる場所で参照される可能性があるため、明確で一貫した命名規則を設けることが重要です。
他の変数と区別しやすいように、グローバル変数には特別な接頭辞や命名パターンを採用することを推奨します。
⇒ たとえば、グローバル変数には「g_」や「Global_」といった接頭辞を付けることで、すぐにグローバル変数であることがわかるようにすると良いでしょう。
- グローバル変数は、プログラムのあらゆる場所で参照される可能性があるため、明確で一貫した命名規則を設けることが重要です。
- 4. グローバル変数の初期化とリセット
- グローバル変数は、プログラム全体で使用されるため、初期化とリセットのタイミングを慎重に管理する必要があります。
特に、プログラムの実行中にグローバル変数の値が変更される場合、別の処理で誤った値を参照するリスクがあります。
⇒ 必要に応じて、グローバル変数の初期化処理やリセット処理を明確に行い、予期しない値の残存を防ぎます。
また、初期化・リセットのタイミングをプログラム全体で統一しましょう。
- グローバル変数は、プログラム全体で使用されるため、初期化とリセットのタイミングを慎重に管理する必要があります。
グローバル変数の使用例
ここでは、具体的なコード例を通じてグローバル変数の使い方を紹介します。
使用例1: グローバル変数を使用してデータを共有する
複数のプロシージャでデータを共有する簡単な方法を紹介します。
'// グローバル変数の宣言
Public Num As Long
Sub 初期化()
Num = 10
End Sub
Sub 表示()
MsgBox "Numの値は " & Num & " です。"
End Sub
処理結果
このコードでは、「初期化」プロシージャでグローバル変数「Num」に値を代入し、「表示」プロシージャでその値をメッセージボックスに表示します。
解説
- Public Num As Long
- この行では、グローバル変数「Num」を宣言しています。
「Public キーワード」を使うことで、この変数はモジュール全体、または他のモジュールでも使用可能になります。
「Num」は 長整数型 (Long) で宣言され、整数を格納することができます。
グローバル変数の特徴として、1度代入された値は、モジュールが閉じられるまでどこでも使えるという利点があります。
- この行では、グローバル変数「Num」を宣言しています。
- Sub 初期化()
Num = 10
End Sub- このブロックは、「初期化」という名前のサブルーチン(操作のまとまり)を定義しています。
このサブルーチンでは、グローバル変数「Num」に 10 という値を代入しています。
この「初期化」サブルーチンを呼び出すことで、グローバル変数「Num」に 10 をセットでき、どのプロシージャからでもその値を参照できます。
サブルーチンは Sub で始まり、End Sub で終了します。
- このブロックは、「初期化」という名前のサブルーチン(操作のまとまり)を定義しています。
- Sub 表示()
MsgBox “Numの値は ” & Num & ” です。”
End Sub- このブロックでは、「表示」という名前のサブルーチンを定義しています。
このサブルーチン内で MsgBox関数を使用し、メッセージボックスに「Num」の値を表示します。
MsgBox は画面にポップアップを表示するための関数です。
ここでは、文字列「Numの値は 」とグローバル変数「Num」の値を結合して、例えば「Numの値は 10 です。」というメッセージが表示されます。
このサブルーチンを呼び出すことで、現在の「Num」の値を確認できます。
- このブロックでは、「表示」という名前のサブルーチンを定義しています。
このようにグローバル変数を使用すると、複数のプロシージャ間で変数を共有できるようになります。
使用例2: グローバル変数を使用してセルの色を変更する
グローバル変数を使って特定の設定を変更し、他のプロシージャでもその設定を変更・使用する方法を紹介します。
たとえば、色やフォントの設定などを変更した後、それを他のプロシージャでも適用します。
'// グローバル変数の宣言
Public FontColor As Long
Sub 初期設定()
'// 初期値を設定
FontColor = RGB(255, 0, 0) ' 赤色
End Sub
Sub フォント色変更()
'// フォント色を青に変更
FontColor = RGB(0, 0, 255) ' 青色
End Sub
Sub テキスト色を設定する()
'// グローバル変数 FontColor を使用してセルのフォント色を変更
Range("A1:A5").Font.Color = FontColor
End Sub
解説
- Public FontColor As Long
- この行では、グローバル変数「FontColor」を 長整数型 (Long) で宣言しています。
Public キーワードを使用することで、この変数はこのモジュール内のすべてのプロシージャからアクセスできます。
「FontColor」には RGB値 という色を表す数値が格納されます。
この変数は他のサブルーチン内でも自由に使われるため、色の値を一括して管理できます。
- この行では、グローバル変数「FontColor」を 長整数型 (Long) で宣言しています。
- Sub 初期設定()
‘// 初期値を設定
FontColor = RGB(255, 0, 0) ‘ 赤色
End Sub- このブロックでは、「初期設定」という名前のサブルーチンが定義されています。
このサブルーチンを実行すると、グローバル変数「FontColor」に「赤色 (RGB: 255, 0, 0)」が格納されます。
⇒ RGB関数は、赤、緑、青の値を使って色を生成します。
この場合、「255, 0, 0」で「赤色」を作成しています。
このサブルーチンを呼び出すことで、後に「
FontColor」が使われるたびに「赤色」が適用されるようになります。
- このブロックでは、「初期設定」という名前のサブルーチンが定義されています。
- Sub フォント色変更()
‘// フォント色を青に変更
FontColor = RGB(0, 0, 255) ‘ 青色
End Sub- このブロックでは、「フォント色変更」という名前のサブルーチンが定義されています。
このサブルーチンを実行すると、グローバル変数「FontColor」に「青色 (RGB: 0, 0, 255)」が格納されます。
⇒ RGB関数を使用して、「青色」を作成しています。
この値をグローバル変数「FontColor」にセットすることで、後に使用される場所に「青色」が適用されるようになります。
このサブルーチンを呼び出すことで、他のプロシージャでもグローバル変数「FontColor」を呼び出すたびに「青色」が適用されます。
- このブロックでは、「フォント色変更」という名前のサブルーチンが定義されています。
- Sub テキスト色を設定する()
‘// グローバル変数 FontColor を使用してセルのフォント色を変更
Range(“A1:A5”).Font.Color = FontColor
End Sub- このブロックでは、テキスト色を設定する という名前のサブルーチンが定義されています。
このサブルーチンを実行すると、グローバル変数「FontColor」に設定されている色が、セル範囲「A1:A5」のフォント色として適用されます。
Range(“A1:A5”).Font.Color はセル範囲「A1:A5」のフォント色を変更するためのプロパティで、その値に「FontColor」を指定することで、先に設定された色が適用されます。
このサブルーチンを呼び出すと、事前に設定された「赤色」や「青色」が指定されたセル範囲に反映されます。
- このブロックでは、テキスト色を設定する という名前のサブルーチンが定義されています。
この例では、グローバル変数「FontColor」を使って、一度設定されたフォント色を複数のプロシージャで共有しています。
設定を変更すると、他のプロシージャでもその変更が反映されるため、同じ設定を何度も指定する必要がなくなります。
このように、設定値や状態を保持して複数のプロシージャで使用する用途としてグローバル変数がよく使われます。
まとめ
この記事では、VBAにおけるグローバル変数の基本的な概念、使用方法、および注意点について詳しく説明しました。
以下に記事の重要なポイントをおさらいします。
ポイントのおさらい
さらに学ぶために
グローバル変数の基本を理解したら、次のステップとして他の変数の種類(静的変数やオブジェクト変数)についても学んでみてください。
これらの変数には特定の用途と利点があり、VBAでの効率的なプログラミングに役立ちます。
今回の記事を参考に、VBAでのグローバル変数の使用方法をマスターし、業務の効率化を図ってください。
グローバル変数を適切に使うことで、VBAプログラミングの力を最大限に発揮できます。