HOME>IT関連>VBA>vba-userform-privateonly

VBA ユーザーフォームへ、グローバル変数を使わずに値を渡したり受け取ったりする方法

VBA

こんにちは。すたユキです。

本記事では、ユーザーフォームグローバル(Public)変数を使わず値をセットしたり受け取ったりする方法を説明します。

グローバル変数はプロシージャやモジュール間を跨いで容易にデータをやり取りできるため、とても便利です

一方、汎用性の高い関数を使ったり、ユーザーフォームを使い回す際など、グローバル変数が多用されていると、使用先で競合が発生し、上手く動作しない可能性があるため注意が必要です。

一般的な方法

一般的には、ユーザーフォームへ値を渡す際には、下記のような方法を使用することが多いのではないでしょうか?

まず、標準モジュールグローバル変数myTextを宣言し、FormTestプロシージャ内でmyTextに値を入れて、ユーザーフォームのUserForm_Initializeイベントテキストボックス(tbTest)に入力しています。

TestForm.Showで下図のようなフォームを表示するようにしました。

初期値として正常に”Hello Sutayuki“が表示されていますね。

テキストボックスオブジェクト名tbTestにしています。

グローバル変数を使わずフォームに値渡し

続いてグローバル変数を使わない場合の初期化の方法ですが、今度は標準モジュール内で処理を完結することができます。実際に見てみましょう。

結果は先程と同じですね。これでグローバル変数を使わずにフォームに値を渡せました

特に説明は不要かもしれませんが、標準モジュール内TestForm.tbTestに直接値を入れています。

余談ですが、これに加えてUserForm_Initializeイベント内でもテキストボックスに値を入れるとどうなるのか?

少し意外かもしれませんが、この場合も標準モジュール内の値が反映されます

どうやらTestFormを一度呼び出した時点で既にユーザーフォームのインスタンスが生成されているようです。

つまり上のコード4行目のWithステートメント開始Initializeイベントが実行されているということですね。

グローバル変数を使わずフォームから値受け取り

それでは最後に、ユーザーフォームから値を受け取ってみましょう

ユーザーがテキストボックス(tbTest)に任意の値を手入力し、実行ボタン(btTest)をクリックすることでテキストボックスの値を受け取るようにします。

コマンドボタンオブジェクト名btTestにしています。

え?これだけ?と思われた方もいらっしゃると思いますが、これだけです。

ポイントは、ここでフォームをUnloadしないことです。代わりにHideメソッドでフォームを一時的に隠します。

UserForm内に処理を書き過ぎてしまうと、後々デバッグする際に大変になります。
フォーム内の処理はできるだけシンプルにし、標準モジュールを複数に分けるなどして処理を書くことで可読性がUPするのでおすすめです。

そして標準モジュール内では下記のように処理を追加します。

テキストボックス(tbTest)に”値を更新しました。“と入力し、実行ボタン(btTest)をクリックすると、フォームを非表示した後、上画像のようなメッセージボックスが表示されます。

メッセージボックスを閉じると、フォームもUnloadされます。

いかがでしたか?

一工夫することで色々な書き方ができて、おもしろいですね。

次回は、×ボタンまたはAlt+F4を押してユーザーフォームを閉じたときの処理をQueryCloseイベントを使わずに行う方法を紹介したいと思います。

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

次の記事はこちら

コメント