
いつもお世話になっております。
VBAのチェックボックスについてお尋ねします。
貼付ファイルのようなユーザーフォームを作成しました。
フレーム1(TEST1)に
1.CheckBox1(全選択)
2.CheckBox2
3.CheckBox3
フレーム2(TEST2)に
4.CheckBox4(全選択)
4.CheckBox5
5.CheckBox6
フレーム外に
6.CheckBox7(全選択)
があります。
フレーム1のCheckBox1にチェックを付けるとCheckBox2とCheckBox3にチェックが入り
フレーム外のCheckBox7にチェックを付けると全てのCheckBoxにチェックが入るようにしたいのですが。
どなたかご教授をお願いします。

No.3ベストアンサー
- 回答日時:
こんにちは。
こういう課題は、"整合性"をどこまで意識するか次第です。
個別のCheckBoxのすべてにチェックが入ったら、必然的に
全選択のCheckBoxにもチェックを入れる、とか、、、。
簡単に済ませようとすると却って面倒だったりしますから、
そこら辺のバランス感覚、が個性として出てしまう課題ですね。
無駄な処理が無いよう、ひとつずつ処理を書いていくと大変なので、
不必要な処理を含むことを許容して、総当たりするように書く方が
結果的に簡単に書くことが出来ます。
これを配布用レベルにまで引き上げるとすれば、
もう少し仕上げていった方がいいのかも知れませんが、
動作仕様としては、ほぼ十分、こんなものであろうと思っています。
ひとつのプロシージャに纏めて書いてあります。
Clickイベントの再帰的な呼び出し、不要な呼び出し、
は、回避するように書いてあります。
オマケですべてのCheckBoxを初期化出来るように書いていますが、
取り敢えず仮に、UserFormをクリックした場合に確認できるようにしています。
※ UserForm モジュール 宣言部 の記述はモジュールの先頭に!
' ' ----- UserForm モジュール ----------------------------------
Option Explicit
' ' ----- UserForm モジュール 宣言部 ---------------------------
Dim arr(1 To 7) As Boolean
Dim blnDisableEv As Boolean
' ' ------------------------------------------------------------
' ' ----- CheckBox の on/off を 切り替える メソッド ------------
Private Sub SelectChks(Optional ByVal n As Long)
Dim m As Long
Dim i As Long
Dim b As Boolean
If n > 0 Then
b = Me.Controls("CheckBox" & n).Value
End If
Select Case n
Case 0, 7
blnDisableEv = True
For i = 1 To 7
arr(i) = b
Me.Controls("CheckBox" & i).Value = b
Next i
blnDisableEv = False
Case Else
arr(n) = b
m = (n - 1) \ 3
Select Case n
Case 1, 4
arr(m * 3 + 2) = b
arr(m * 3 + 3) = b
Case Else
If arr(m * 3 + 2) Xor arr(m * 3 + 3) Then
arr(m * 3 + 1) = False
Else
arr(m * 3 + 1) = b
End If
End Select
If arr(1) Xor arr(4) Then
arr(7) = False
Else
arr(7) = arr(1)
End If
blnDisableEv = True
For i = 1 To 7
Me.Controls("CheckBox" & i).Value = arr(i)
Next i
blnDisableEv = False
End Select
End Sub
' ' ----- 各CheckBox の イベント -------------------------------
Private Sub CheckBox1_Click() ' / Frame1 : SelectBoth
If blnDisableEv Then Exit Sub
SelectChks 1
End Sub
Private Sub CheckBox2_Click() ' / Frame1
If blnDisableEv Then Exit Sub
SelectChks 2
End Sub
Private Sub CheckBox3_Click() ' / Frame1
If blnDisableEv Then Exit Sub
SelectChks 3
End Sub
Private Sub CheckBox4_Click() ' / Frame2 : SelectBoth
If blnDisableEv Then Exit Sub
SelectChks 4
End Sub
Private Sub CheckBox5_Click() ' / Frame2
If blnDisableEv Then Exit Sub
SelectChks 5
End Sub
Private Sub CheckBox6_Click() ' / Frame2
If blnDisableEv Then Exit Sub
SelectChks 6
End Sub
Private Sub CheckBox7_Click() ' / UserForm : SelectAll
If blnDisableEv Then Exit Sub
SelectChks 7
End Sub
' ' ----- オマケ CheckBox を すべて off に ---------------------
Private Sub UserForm_Click()
SelectChks
End Sub
' ' ------------------------------------------------------------
No.4
- 回答日時:
#3、cjです。
追加補足です。"整合性"と簡単さについて、ふと思ったのですが、
CheckBox1、CheckBox4、CheckBox7、
については、いっそ、CommandButtonにしちゃえば、
面倒なことを考えずに済みますし、
ユーザーにも違和感なく受け入れられる、
という考え方もありますね。
実際、そういうスタイルのUIを見掛けることもありますし、、、。
正解はひとつではないですから、
ご自分に会ったものを見つけてください。
No.2
- 回答日時:
こんばんは!
チェックの解除は考えなくても良いのですね?
ごくごく簡単に
Private Sub CheckBox1_Click()
CheckBox2 = True
CheckBox3 = True
End Sub
Private Sub CheckBox4_Click()
CheckBox5 = True
CheckBox6 = True
End Sub
Private Sub CheckBox7_Click()
CheckBox1 = True
CheckBox4 = True
End Sub
といった感じではどうでしょうか?m(_ _)m
No.1
- 回答日時:
フレームは気にしないとして・・・・
ユーザーフォームモジュールに以下のコードを記述してください。
Private Sub CheckBox1_Click()
Me.CheckBox2.Value = Me.CheckBox1.Value
Me.CheckBox3.Value = Me.CheckBox1.Value
End Sub
Private Sub CheckBox4_Click()
Me.CheckBox5.Value = Me.CheckBox4.Value
Me.CheckBox6.Value = Me.CheckBox4.Value
End Sub
Private Sub CheckBox7_Click()
Me.CheckBox1.Value = Me.CheckBox7.Value
Me.CheckBox4.Value = Me.CheckBox7.Value
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
ユーザ―フォーム上のチェックboxのチェックを外した際のセル反映の取り消し
Excel(エクセル)
-
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
-
4
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
5
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
6
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
7
VBA ユーザーフォーム上のチェックボックスの合計を別シートに標示させるには?
Visual Basic(VBA)
-
8
(VBA)チェックボックスのclickのイベントが、プログラムからの操作でも反応してしまいます。
Visual Basic(VBA)
-
9
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
10
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
11
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
12
エクセルユーザーフォームのチェックボックスのCaptionにセルの値を入れたい。
Excel(エクセル)
-
13
マクロ実行時、ユーザーフォームにラベルのテキストが表示されません。
Access(アクセス)
-
14
エクセルVBA「リストボックスで選択した値をテキストボックスで変更してシート上セルに反映したい」
Excel(エクセル)
-
15
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
-
16
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
-
17
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
18
Application.Runエラー(1004)
Excel(エクセル)
-
19
【Excel VBA】先頭の「0」飛びを埋める方法
Visual Basic(VBA)
-
20
VBA リストボックスをダブルクリックしデータを修正したいのですが…。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAユーザーフォームのチェック...
-
フレームを表示できないブラウ...
-
エクセルのシート上に別のシー...
-
デジタル時計の時刻合わせの方...
-
Javascript_submit()完了後に処...
-
マイページはどこを開くの
-
ウインドウを毎回同じ位置、大...
-
[Java] Edgeでのアドレスバー非...
-
Excelでワードアートや図を常に...
-
【このスクリプトの実行を中止...
-
Excel VBAでの右クリックのポッ...
-
別フォームから戻ったときのイ...
-
「Cancel = True」とはどういう...
-
一定時間おきにアラームやポッ...
-
小さな表示窓の呼び方は
-
TikTokLiteの自動スクロールの...
-
エクセルVBAでフォームのListbo...
-
Googleスプレッドシートで特定...
-
PDFを(htmlのように)無限に縦...
-
エクセルでポップアップを出し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのユーザーフォームのframe...
-
unknownユニキャストフレームと...
-
Ethernetフレームのキャプチャ
-
VBAユーザーフォームのチェック...
-
ホームページ作成で困っています。
-
ヤフーメールの
-
フレーム分割ページからトップ...
-
ビルダーで複数フレーム
-
違うフレームのデータを同時に...
-
フレームページからフレームペ...
-
フレーム内のリンク
-
Explorer5で開けないJavaScript...
-
サイト作成について質問です。H...
-
HP作成に関する質問です
-
920Pの画像表示と、カメラ機能...
-
フレームについて。
-
OSI参照モデルの不明点
-
Aviutilでのフレーム補間なので...
-
フレーム内のリンクが一回しか...
-
ホームページ作成 これはフレ...
おすすめ情報