こんにちは。すたユキです。
本記事では、ユーザーフォームへグローバル(Public)変数を使わずに値をセットしたり受け取ったりする方法を説明します。
グローバル変数はプロシージャやモジュール間を跨いで容易にデータをやり取りできるため、とても便利です。
一方、汎用性の高い関数を使ったり、ユーザーフォームを使い回す際など、グローバル変数が多用されていると、使用先で競合が発生し、上手く動作しない可能性があるため注意が必要です。
一般的な方法
一般的には、ユーザーフォームへ値を渡す際には、下記のような方法を使用することが多いのではないでしょうか?
1 2 3 4 5 6 7 8 9 10 |
Option Explicit Public myText As String Sub FormTest() myText = "Hello Sutayuki" TestForm.Show End Sub |
1 2 3 4 5 |
Private Sub UserForm_Initialize() Me.tbTest.Value = myText End Sub |
まず、標準モジュールでグローバル変数myTextを宣言し、FormTestプロシージャ内でmyTextに値を入れて、ユーザーフォームのUserForm_Initializeイベントでテキストボックス(tbTest)に入力しています。
TestForm.Showで下図のようなフォームを表示するようにしました。
初期値として正常に”Hello Sutayuki“が表示されていますね。
※テキストボックスのオブジェクト名をtbTestにしています。
グローバル変数を使わずフォームに値渡し
続いてグローバル変数を使わない場合の初期化の方法ですが、今度は標準モジュール内で処理を完結することができます。実際に見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
Option Explicit Sub FormTest() With TestForm 'テキストボックスへ初期値を入力 .tbTest.Value = "Hello Sutayuki" 'ユーザーフォーム起動 .Show End With End Sub |
結果は先程と同じですね。これでグローバル変数を使わずにフォームに値を渡せました。
特に説明は不要かもしれませんが、標準モジュール内でTestForm.tbTestに直接値を入れています。
余談ですが、これに加えてUserForm_Initializeイベント内でもテキストボックスに値を入れるとどうなるのか?
少し意外かもしれませんが、この場合も標準モジュール内の値が反映されます。
どうやらTestFormを一度呼び出した時点で既にユーザーフォームのインスタンスが生成されているようです。
つまり上のコード4行目のWithステートメント開始でInitializeイベントが実行されているということですね。
グローバル変数を使わずフォームから値受け取り
それでは最後に、ユーザーフォームから値を受け取ってみましょう。
ユーザーがテキストボックス(tbTest)に任意の値を手入力し、実行ボタン(btTest)をクリックすることでテキストボックスの値を受け取るようにします。
※コマンドボタンのオブジェクト名をbtTestにしています。
1 2 3 |
Private Sub btTest_Click() Me.Hide End Sub |
え?これだけ?と思われた方もいらっしゃると思いますが、これだけです。
ポイントは、ここでフォームをUnloadしないことです。代わりにHideメソッドでフォームを一時的に隠します。
そして標準モジュール内では下記のように処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Option Explicit Sub FormTest() With TestForm 'テキストボックスへ初期値を入力 .tbTest.Value = "Hello Sutayuki" 'ユーザーフォーム起動 .Show '********** 以下の処理を追加 ********** '実行ボタンクリック時のテキストボックスの値を表示 MsgBox .tbTest.Value End With '隠れているだけなので処理の最後にフォームを閉じる Unload TestForm End Sub |
テキストボックス(tbTest)に”値を更新しました。“と入力し、実行ボタン(btTest)をクリックすると、フォームを非表示した後、上画像のようなメッセージボックスが表示されます。
メッセージボックスを閉じると、フォームもUnloadされます。
いかがでしたか?
一工夫することで色々な書き方ができて、おもしろいですね。
次回は、×ボタンまたはAlt+F4を押してユーザーフォームを閉じたときの処理をQueryCloseイベントを使わずに行う方法を紹介したいと思います。
最後まで読んでいただきありがとうございました。
次の記事はこちら
コメント