プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。

以下のような仕様の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の方法を教えてください。

どうぞよろしくお願いします

「VBA ユーザーフォームの値の取得方法」の質問画像

A 回答 (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
「VBA ユーザーフォームの値の取得方法」の回答画像1
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!