• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAユーザーフォームのチェックボックスについて)

VBAユーザーフォームのチェックボックスについて

このQ&Aのポイント
  • VBAのチェックボックスについてお尋ねします。貼付ファイルのようなユーザーフォームを作成しました。
  • フレーム1のCheckBox1にチェックを付けるとCheckBox2とCheckBox3にチェックが入り、フレーム外のCheckBox7にチェックを付けると全てのCheckBoxにチェックが入るようにしたいのですが。
  • VBAのチェックボックスについてご教授をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答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 ' ' ------------------------------------------------------------

genta1019boston
質問者

お礼

どうもありがとうございました。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#3、cjです。追加補足です。 "整合性"と簡単さについて、ふと思ったのですが、 CheckBox1、CheckBox4、CheckBox7、 については、いっそ、CommandButtonにしちゃえば、 面倒なことを考えずに済みますし、 ユーザーにも違和感なく受け入れられる、 という考え方もありますね。 実際、そういうスタイルのUIを見掛けることもありますし、、、。 正解はひとつではないですから、 ご自分に会ったものを見つけてください。

genta1019boston
質問者

お礼

どうもありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答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

genta1019boston
質問者

お礼

どうもありがとうございました。

  • eden3616
  • ベストアンサー率65% (267/405)
回答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

genta1019boston
質問者

お礼

どうもありがとうございました。

関連するQ&A