ユーザーフォームと、その呼び出し側との値の受け渡しは標準モジュールに定義した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