
いつもお世話になっております。
以下のような仕様の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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- Excel(エクセル) コンボボックス及びリストボックスを5段階連動させる方法をご存知の方ご教授頂きたいです。 Excelで 3 2022/04/03 21:43
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- 防犯カメラ・監視カメラ・小型カメラ Windowsのカメラ機能。設定した通りのfpsでの撮影ができず、コマ落ち動画になる。修正するには? 2 2023/01/29 09:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Accessのページヘッターを最初...
-
ExcelVBAのInputBoxメソッドの...
-
エクセルのマクロの止め方
-
RTHDCPL.EXE... が起動時に出て...
-
Access VBAで行ラベルが定義さ...
-
【Excel VBA】 WorksheetやRa...
-
エクセルVBAでUserFormを起動し...
-
アクセス enterで次ページ(レ...
-
Accessのプロシージャ名が勝手...
-
callで順に実行されるプロシー...
-
エクセルVBAが対応できるプログ...
-
VBAにおける Option Explicitの...
-
Excel VBAで「プログラム実行」...
-
このページ、どうなってるので...
-
SQL文(クエリ)をご教授くださ...
-
ACCESSのVBAについて
-
ドメインの取得日を変更する方法
-
クエリー
-
日付の表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
callで順に実行されるプロシー...
-
Excel VBAで「プログラム実行」...
-
【Excel VBA】 WorksheetやRa...
-
OutlookVBAで作成したマクロに...
-
Accessでグローバル変数を宣言...
-
或るプロシージャの呼び出し元判定
-
VBA プロシージャの名前の取得
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
excel/vba/public変数
-
ACCESS2007インポート時の空白...
-
PL/SQLのエラーについて
-
ACCESS マクロをモジュールに変...
-
エクセルVBAが対応できるプログ...
-
DB2でのストアドプロシージャの...
-
エクセルVBAの次のコードの...
-
Excel:ThisWorkbookオブジェク...
-
アクセスのVBについて
おすすめ情報