- ベストアンサー
VBAユーザーフォームのチェックボックスについて
- VBAのチェックボックスについてお尋ねします。貼付ファイルのようなユーザーフォームを作成しました。
- フレーム1のCheckBox1にチェックを付けるとCheckBox2とCheckBox3にチェックが入り、フレーム外のCheckBox7にチェックを付けると全てのCheckBoxにチェックが入るようにしたいのですが。
- VBAのチェックボックスについてご教授をお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 こういう課題は、"整合性"をどこまで意識するか次第です。 個別の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 ' ' ------------------------------------------------------------
その他の回答 (3)
- cj_mover
- ベストアンサー率76% (292/381)
#3、cjです。追加補足です。 "整合性"と簡単さについて、ふと思ったのですが、 CheckBox1、CheckBox4、CheckBox7、 については、いっそ、CommandButtonにしちゃえば、 面倒なことを考えずに済みますし、 ユーザーにも違和感なく受け入れられる、 という考え方もありますね。 実際、そういうスタイルのUIを見掛けることもありますし、、、。 正解はひとつではないですから、 ご自分に会ったものを見つけてください。
お礼
どうもありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! チェックの解除は考えなくても良いのですね? ごくごく簡単に 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
お礼
どうもありがとうございました。
- eden3616
- ベストアンサー率65% (267/405)
フレームは気にしないとして・・・・ ユーザーフォームモジュールに以下のコードを記述してください。 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
お礼
どうもありがとうございました。
お礼
どうもありがとうございました。