プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。

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にチェックが入るようにしたいのですが。

どなたかご教授をお願いします。

「VBAユーザーフォームのチェックボックス」の質問画像

A 回答 (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
' ' ------------------------------------------------------------
    • good
    • 1
この回答へのお礼

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

お礼日時:2014/10/15 14:48

#3、cjです。

追加補足です。

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

正解はひとつではないですから、
ご自分に会ったものを見つけてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/15 14:49

こんばんは!



チェックの解除は考えなくても良いのですね?

ごくごく簡単に

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/15 14:48

フレームは気にしないとして・・・・



ユーザーフォームモジュールに以下のコードを記述してください。

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
    • good
    • 1
この回答へのお礼

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

お礼日時:2014/10/15 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています