EXCEL VBAメモ - UserFormとの値の受け渡し(プロパティとプロシージャ)
ユーザーフォームと、その呼び出し側との値の受け渡しは標準モジュールに定義したPublic変数を介して行っていたのですが、プロパティとプロシージャでもできることを知ったのでメモ。
ユーザーフォーム側
クラスモジュールを使用する場合の様に、メンバ変数mData1とmData2を定義し、それにアクセスするプロパティをプロシージャ(Sub/Function)を定義する。
ユーザーフォームを閉じる処理は、Unloadではなく、Hideを使用する。
Option Explicit Private mData1 As Long Private mData2 As Long 'プロパティ Property Let Data1(d As Long) mData1 = d End Property Property Get Data1() As Long Data1 = mData1 End Property 'Setter/Getter Public Sub SetData2(d As Long) mData2 = d End Sub Public Function GetData2() As Long GetData2 = mData2 End Function 'データ表示 Private Sub CommandButton1_Click() TextBox1.MultiLine = True TextBox1.Text = "Data1 : " & mData1 & vbCrLf & "Data2 : " & mData2 End Sub 'データを10倍にしてクローズ Private Sub CommandButton2_Click() mData1 = mData1 * 10 mData2 = mData2 * 10 Me.Hide End Sub
呼び出し側
ユーザーフォームをLoadしたのち、プロパティやプロシージャで値をユーザーフォームに渡してから、Showでユーザーフォームを表示させる。
ユーザーフォーム側のHideで処理が戻ってくるので、Unload前にプロパティやプロシージャで値を読み取る。Unload後の読み取りでは値は初期値に戻ってしまうので注意。
Option Explicit Private Sub CommandButton1_Click() Load UserForm1 UserForm1.Data1 = 1 Call UserForm1.SetData2(2) UserForm1.Show MsgBox "UserForm1の戻り値" & vbCrLf & _ "Data1 : " & UserForm1.Data1 & vbCrLf & _ "Data2 : " & UserForm1.GetData2 Unload UserForm1 'Unload後は読み取る値は0になる MsgBox "UserForm1の戻り値" & vbCrLf & _ "Data1 : " & UserForm1.Data1 & vbCrLf & _ "Data2 : " & UserForm1.GetData2 End Sub