- 締切済み
VBA ユーザーフォームの値の取得方法
いつもお世話になっております。 以下のような仕様のVBAコードを作成したいと考えています。 (貼付資料も参照してください) ■仕様 (1)ユーザーフォーム 1.処理の対象となる市名をチェックボックスから選択 2.処理の対象となるシート名をコンボボックスから選択 (2)ユーザーフォームで選択した 選択したシートの対象市名のデータを配列に格納 (3)格納した配列を元に一覧、詳細の表を作成 ■オブジェクト ●ユーザーフォーム ・フレーム Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 Frame4:対象年度 ・チェックボックス CheckBox1:フレーム外の全選択 CheckBox2~4:各フレームの全選択 CheckBox5~11:市町村名(横浜市~小山市の順) ・コンボボックス ComboBox1:対象年度 ●ワークシート ■不明な事 (1)⇒(2)の処理(ユーザーフォームで選択した項目を他のプロシージャで使用する) について質問させていただきます。 私の頭の中では、 I.パブリック変数を用意して、CheckBoxやComboBoxで選択した項目を格納 II.プロシージャ引数として・・・ の2つの方法が候補として浮かんでいます。 Iに関して CheckBox1:対象年度については、オブジェクトが1つしかないので、 適当なパブリック変数(今回はmySh)を用意して、 mySh=Combobox1.Value とすれば、仕様は満たせると思いますが、 CheckBoxに関しては、数が多いので,どのようにすれば良いのかイマイチ分かりません。 IIに関しては、全く見当が付きません。 ■質問 (1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか? (2)I又はIIの方法の優劣はあるのでしょうか? (3)I、IIの方法を教えてください。 どうぞよろしくお願いします
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- eden3616
- ベストアンサー率65% (267/405)
つまり、呼び出し先のプロシージャでデータを格納したいため、 フォームの選択結果をキーとして渡したいということでしょうか? >(1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか? 呼び出し先のプロシージャが同じユーザーフォーム内であれば CommandButton1_ClickプロシージャからCall ○○で呼び出して 呼び出し先の○○プロシージャでFor i = 5 To 11~Nextで Me.Controls("CheckBox" & i).Valueとして値を判定すればいいし、 呼び出し先が標準モジュールであれば UserForm1.Controls("CheckBox" & i).Valueで同じく値を判定すればよいのでは? ユーザーフォームは呼び出し先のプロシージャからUnload UserForm1すれば消せますし。 >(2)I又はIIの方法の優劣はあるのでしょうか? 引数でも、広域変数で渡しても好みの問題かと。 >(3)I、IIの方法を教えてください。 I ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ■ユーザーフォームモジュールへ記述 (以下ではコンボボックスしか格納していませんが、チェックボックスはII参照して同様に。) Private Sub CommandButton2_Click() pub_cmBox_no = Me.ComboBox1.ListIndex pub_cmBox_str = Me.ComboBox1.Value Unload Me Call sample2 End Sub ■標準モジュールへ記述 '広域変数を用意 Public pub_cmBox_no As Integer Public pub_cmBox_str As String '結果を表示 Sub sample2() MsgBox "▼選択されたコンボボックス" & vbCrLf & pub_cmBox_no + 1 & "番目の" & pub_cmBox_str End Sub II~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ■ユーザーフォームモジュールへ記述 Private Sub CommandButton1_Click() Dim list_boo(6) As Boolean Dim list_str() As String Dim cnt As Integer 'チェックボックス判定 For i = 5 To 11 'チェックボックスの状態を配列に格納 list_boo(i - 5) = Me.Controls("CheckBox" & i).Value If list_boo(i - 5) Then 'Trueのリスト配列(名前)を作成 cnt = cnt + 1 ReDim Preserve list_str(1, cnt) list_str(0, cnt - 1) = "CheckBox" & i list_str(1, cnt - 1) = Me.Controls("CheckBox" & i).Caption Else End If Next i '要素数1削除 If Sgn(list_str) <> 0 Then ReDim Preserve list_str(1, cnt - 1) Unload Me 'sample1プロシージャを引数つきで呼び出し Call sample1(list_boo, list_str, Me.ComboBox1.ListIndex, Me.ComboBox1.Value) End Sub ■標準(ユーザーフォーム)モジュールへ記述 Sub sample1( _ list_boo() As Boolean, list_str() As String, _ cmBox_no As Integer, cmBox_str As String) Dim i As Integer Dim msg As String msg = "▼全チェックボックスの状態" For i = 0 To UBound(list_boo) msg = msg & vbCrLf & "CheckBox" & i + 5 & "=" & list_boo(i) Next i msg = msg & vbCrLf & "▼チェックされているもの" If Sgn(list_str) <> 0 Then For i = 0 To UBound(list_str, 2) msg = msg & vbCrLf & list_str(0, i) & "=" & list_str(1, i) Next i Else msg = msg & vbCrLf & "1つもチェックされていません" End If msg = msg & vbCrLf & "▼選択されたコンボボックス" If cmBox_no > -1 Then msg = msg & vbCrLf & cmBox_no + 1 & "番目の" & cmBox_str Else msg = msg & vbCrLf & "1つも選択されていません" End If MsgBox msg End Sub