【VBA】Callステートメントで取得した変数を他のモジュールでも使う方法|グローバル変数の活用

目次

経緯

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でも保持され、問題なく使用できるようになりました。


グローバル変数とは?

グローバル変数とは、モジュールの中でSubFunctionの外にPublicキーワードを使って宣言された変数のことです。
これにより、プロジェクト内のすべてのプロシージャ・関数・モジュールからその変数を参照・操作することができます。

また、グローバル変数は、標準モジュール内で宣言する必要があります。 クラスモジュールやシートモジュールでは意図したとおりに機能しない場合があります。


注意点

・グローバル変数は非常に便利ですが、意図しない上書きやバグを招きやすいため、管理には注意が必要です。
・スコープが広いため、変数名の重複や衝突が発生しないよう、命名規則をしっかり設けることをおすすめします。


まとめ

VBAでモジュール間にまたがって変数を共有したい場合、グローバル変数を使うのが最も簡単で確実な方法です。
変数をPublicでモジュールの先頭に定義しておけば、どのサブルーチンからもその値にアクセスできます。

「Callステートメントで呼び出したサブルーチンで取得した値を、他モジュールで使いたい」というニーズに対して、非常に有効な手段です。
ぜひご自身のVBAプロジェクトにお役立てください。

最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次