• 締切済み

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の方法を教えてください。 どうぞよろしくお願いします

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

つまり、呼び出し先のプロシージャでデータを格納したいため、 フォームの選択結果をキーとして渡したいということでしょうか? >(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

関連するQ&A

専門家に質問してみよう