経緯
Excel VBAで複数のモジュールを使ってコードを整理していたところ、
「Module1
で取得した変数を、Module2
の処理でも使いたい」という場面がありました。
具体的には、Call
ステートメントを使って別のサブルーチンを呼び出し、そこで代入された値を、呼び出し元の処理内でも使いたいと考えました。
この方法について調査・検証を行い、最終的にグローバル変数を使うことで解決しました。
まずうまくいかなかったコード
以下は、最初に試したがうまくいかなかった例です。
' Module1
Sub MySub()
Dim myVar As String
myVar = "Hello, World!"
End Sub
' Module2
Sub MyOtherSub()
Call MySub()
MsgBox myVar
End Sub
この場合、MySub
内で定義されたmyVar
はローカル変数であり、MySub
の処理が終わった時点で破棄されます。
そのため、MyOtherSub
からmyVar
を参照しようとすると、認識されずエラーとなります。
解決策:グローバル変数を使う
うまくいったのは、変数をモジュールの外側かつPublic
で宣言する方法でした。
このようにすれば、全てのモジュールから変数にアクセスすることができます。
' Module1
' グローバル変数を定義する
Public myVar As String
Sub MySub()
myVar = "Hello, World!"
End Sub
' Module2
Sub MyOtherSub()
Call MySub()
MsgBox myVar
End Sub
このようにすることで、MySub
で代入した値がMyOtherSub
でも保持され、問題なく使用できるようになりました。
グローバル変数とは?
グローバル変数とは、モジュールの中でSub
やFunction
の外にPublic
キーワードを使って宣言された変数のことです。
これにより、プロジェクト内のすべてのプロシージャ・関数・モジュールからその変数を参照・操作することができます。
また、グローバル変数は、標準モジュール内で宣言する必要があります。 クラスモジュールやシートモジュールでは意図したとおりに機能しない場合があります。
注意点
・グローバル変数は非常に便利ですが、意図しない上書きやバグを招きやすいため、管理には注意が必要です。
・スコープが広いため、変数名の重複や衝突が発生しないよう、命名規則をしっかり設けることをおすすめします。
まとめ
VBAでモジュール間にまたがって変数を共有したい場合、グローバル変数を使うのが最も簡単で確実な方法です。
変数をPublic
でモジュールの先頭に定義しておけば、どのサブルーチンからもその値にアクセスできます。
「Callステートメントで呼び出したサブルーチンで取得した値を、他モジュールで使いたい」というニーズに対して、非常に有効な手段です。
ぜひご自身のVBAプロジェクトにお役立てください。
最後までお読みいただきありがとうございました。