見出し画像

Excel VBAでUserFormの情報をまとめて取得する

 VBAでのUserFormの使い方として、条件や設定値を人が入力し、それをVBAで値を受け取って処理をするということがよくあります。VBAで値を受けるとき、ABC = TextBoxABC.Text 、 flgXYZ = CheckBoxXYZ.Value などと毎回書いていると始めは良いのですがコントロールの数が多いと混乱してきたので、まとめて取得する方法を考えました。
 やり方は、指定のUserFormのコントロールを順に見ていき、コントロールの種類がテキストボックスならテキストを、チェックボックスなら値を取得するなどを決めておき、取得したものを辞書(Dictionary)に入れる、というものです。

例えば次のようなUserFormが起動しているとき、

UserFormの例

’---------------------------------
TextBox1 これはテキストボックスです。
Label1 これはラベルです
ComboBox1 これはコンボボックスです
CommandButton1 これはコマンドボタンです
CheckBox1 True
CheckBox2 False
CheckBox3 True
OptionButton1 False
OptionButton2 True
OptionButton3 False
OptionButton4 False
’---------------------------------
というような結果が一括して得られます。

 VBAのソースコードは以下です。辞書に何を残すかは必要に応じて変えていただければよいと思います。
この部分 dic(ctrl.****) = ctrl.******* を修正してください。複数の情報を取りたい場合は、
dic(ctrl.Name) = Array(ctrl.Caption, ctrl.Text)
などと配列にしても良いと思います。

'フォームの起動
Public Sub testUserFormShow()
    Dim uf As UserForm1
    Set uf = New UserForm1
    uf.Show vbModeless
End Sub
'フォームの情報の取得
Public Sub testGetInfo()
    Dim dic As Dictionary
    Dim uf As UserForm
    Set uf = UserForm1
    Set dic = GetUserFormValue(uf)
    Dim keywd As Variant
    For Each keywd In dic.Keys
        Debug.Print keywd, dic(keywd)
    Next
    Set uf = Nothing
    Set dic = Nothing
End Sub
'フォームの情報の取得
Public Function GetUserFormValue(uf As UserForm) As Dictionary
    Dim dic As New Dictionary '辞書の初期化
    Dim Tname As String 'タイプ名
    Dim ctrl As Control
    For Each ctrl In uf.Controls 'ユーザーフォームのコントロールについて
        Tname = TypeName(ctrl)
        If Tname = "OptionButton" Or Tname = "CheckBox" Then
            dic(ctrl.Caption) = ctrl.Value 'キャプションと値
        ElseIf Tname = "TextBox" Or Tname = "ListBox" Or Tname = "ComboBox" Then
            dic(ctrl.Name) = ctrl.Value 'コントロール名と値
        ElseIf Tname = "CommandButton" Or Tname = "Label" Then
            dic(ctrl.Name) = ctrl.Caption 'コントロール名とキャプション
        End If
    Next
    Set GetUserFormValue = dic
    Set dic = Nothing
End Function

#Excel , #VBA , #ユーザーフォーム , #コントロール

応援してやろうということで、お気持ちをいただければ嬉しいです。もっと勉強したり、調べたりする糧にしたいと思います。