
いつもお世話になっております。
以下のような仕様の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の方法を教えてください。
どうぞよろしくお願いします

A 回答 (1件)
- 最新から表示
- 回答順に表示
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
callで順に実行されるプロシー...
-
Access VBAで行ラベルが定義さ...
-
Excel VBAで「プログラム実行」...
-
或るプロシージャの呼び出し元判定
-
エクセルVBAが対応できるプログ...
-
【Excel VBA】 WorksheetやRa...
-
エクセルVBAでUserFormを起動し...
-
VBA ユーザーフォームの値の取...
-
VBAのプロシージャー間で、変数の受...
-
PL/SQLのエラーについて
-
Statement ignored というエラー
-
Accessの数値から時間に変換す...
-
ODBCリンクの際にACCESSでは読...
-
WHERE句の実行順序
-
sqlplusでヘッダーが付かない
-
sqlplusのspoolで空白行出現
-
PL/SQLの例外
-
キャッシュを使わずにSELECTを...
-
会社の〇〇部と〇〇課の違いっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
callで順に実行されるプロシー...
-
エクセルVBAでUserFormを起動し...
-
【Excel VBA】 WorksheetやRa...
-
OutlookVBAで作成したマクロに...
-
Excel VBAで「プログラム実行」...
-
或るプロシージャの呼び出し元判定
-
Accessでグローバル変数を宣言...
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
VBA プロシージャの名前の取得
-
エクセルVBAが対応できるプログ...
-
PL/SQLのエラーについて
-
ACCESS2007インポート時の空白...
-
Excel2000 セルデータ検索ウィ...
-
ブックオープン時にテキストボ...
-
ACCESS マクロをモジュールに変...
-
連番欠番アルゴリズム
-
DB2でのストアドプロシージャの...
-
ExcelVBAのInputBoxメソッドの...
おすすめ情報