hakeの日記

Windows環境でプログラミングの勉強をしています。

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