Excel VBAでUserFormの情報をまとめて取得する
VBAでのUserFormの使い方として、条件や設定値を人が入力し、それをVBAで値を受け取って処理をするということがよくあります。VBAで値を受けるとき、ABC = TextBoxABC.Text 、 flgXYZ = CheckBoxXYZ.Value などと毎回書いていると始めは良いのですがコントロールの数が多いと混乱してきたので、まとめて取得する方法を考えました。
やり方は、指定のUserFormのコントロールを順に見ていき、コントロールの種類がテキストボックスならテキストを、チェックボックスなら値を取得するなどを決めておき、取得したものを辞書(Dictionary)に入れる、というものです。
例えば次のような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
応援してやろうということで、お気持ちをいただければ嬉しいです。もっと勉強したり、調べたりする糧にしたいと思います。