【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プロジェクトにお役立てください。

技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。

プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。

気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。

[Kindle Unlimited 読み放題プランをチェックする]

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

この記事を書いた人

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

目次