• 締切済み

エクセルVBA ユーザーフォームのチェックボックス

エクセルVBAのユーザーフォームのチェックボックスについて教えてください。 frame1の中にCheckbox1~5があるのですが、以下のように指示したいです。 Checkbox1~4は自由にチェックできるようにしておいて、Checkbox1~4の全てにチェックが入った場合に、Checkbox1~4の全てチェックを外し(False)、その代わりCheckbox5を自動的にチェックを入れたいです(True)。 CommandButtonなどをクリックして初めて変化するのではなく、ユーザーフォームにチェックを入れている間に自動的にチェックを入れたり外したいです。 特に「Checkbox1~4の全てにチェックが入った場合」というのを、どこに入力するのか分かりませんでした。 1箇所だけならPrivate Sub CheckBox1_Click()と始めたら良いんだとおもうのですが。。。 よろしくお願いします

みんなの回答

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

#2、cjです。 すみません、うっかりミスしてました。 # 以前ならこの手のミス、即、ツッコミ入れてくれる方も # 居らしたのですけれど、最近は、、、。 使用感には影響ないかも知れませんが、 再帰をキチンとキャンセルするように書き直しましたので、 差し替えてください。 (もしも、_Click イベント使う場合でも同じようにケアしてください) 追加の記述、4カ所、4行(★マークの行)です。 ' ' =====Userform モジュール===== Private flgDisEn As Boolean  ' ←★モジュールの宣言部に ! Private Sub CheckBox1_Change()   Call CheckMoveUp End Sub Private Sub CheckBox2_Change()   Call CheckMoveUp End Sub Private Sub CheckBox3_Change()   Call CheckMoveUp End Sub Private Sub CheckBox4_Change()   Call CheckMoveUp End Sub Private Sub CheckMoveUp()   Dim i As Long ' ' 呼び出し元が、このプロシージャだった場合は、抜ける   If flgDisEn Then Exit Sub  '  ★ ' ' CheckBox1 から CheckBox4 までの .Value をチェック   For i = 1 To 4     If Not Controls("CheckBox" & i).Value Then Exit For   Next ' ' すべてTrueだったら i は 5 なので、5 以下なら抜ける   If i < 5 Then Exit Sub ' ' 再帰呼び出しで処理を繰り返さないようにフラグ   flgDisEn = True  '  ★ ' ' CheckBox5 を True に   Me.CheckBox5.Value = True ' ' CheckBox1 から CheckBox4 までの .Value を False に   For i = 1 To 4     Controls("CheckBox" & i).Value = False   Next ' ' フラグを元に戻す   flgDisEn = False  '  ★ End Sub

kidibotkbg
質問者

お礼

回答ありがとうございます サブルーチンを使ったことがないこともあって、最初の回答と違いが分かるには、まだ勉強が必要のようです わざわざ作り直していただいてありがとうございました お礼が遅くなりすみませんでした

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

> 特に「Checkbox1~4の全てにチェックが入った場合」というのを、どこに入力するのか分かりませんでした。 "全てにチェックが入った場合"のイベントというのは Userformには用意されていません。  (やろうと思えば、クラスモジュールと標準モジュールを組合わせて、  ひとつのイベントプロシージャに纏めることは可能ですが、  目的の処理に対しては、やたらと記述が増えてしまい、  やり過ぎの感があります。) CheckBoxが数十個あって、、、とかならクラスモジュールをお奨めしますが。 > 1箇所だけならPrivate Sub CheckBox1_Click()と始めたら良いんだとおもうのですが。。。 はい、1箇所ずつ、コツコツ積み上げて行くことになります。 ということで、各CheckBoxひとつにつき イベントプロシージャもひとつずつ書きます。 イベントプロシージャだけで完結することも可能ですが、 同じものを4つ書くのは無駄が多いし、 後から編集を加えるのも大変です。 なので、サブルーチンを呼ぶようにします。 それから、イベントは、_Change イベント になります。 ' ' =====Userform モジュール===== Private Sub CheckBox1_Change()   Call CheckMoveUp End Sub Private Sub CheckBox2_Change()   Call CheckMoveUp End Sub Private Sub CheckBox3_Change()   Call CheckMoveUp End Sub Private Sub CheckBox4_Change()   Call CheckMoveUp End Sub Private Sub CheckMoveUp()   Dim i As Long ' ' CheckBox1 から CheckBox4 までの .Value をチェック   For i = 1 To 4 ' ' 各CheckBox の値が False ならループを抜けることでカウントを止める     If Controls("CheckBox" & i).Value = False Then Exit For   Next i ' ' すべてTrueだったら i は 5 になるので、5 以下の場合は抜ける   If i < 5 Then Exit Sub ' ' CheckBox5 を True に   Me.CheckBox5.Value = True ' ' CheckBox1 から CheckBox4 までの .Value を False に   For i = 1 To 4     Controls("CheckBox" & i).Value = False   Next i End Sub

kidibotkbg
質問者

お礼

回答ありがとうございます お礼が遅くなりすみません

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

こんばんは、参考に Private Sub CheckBox1_Click()   Check確認 End Sub Private Sub CheckBox2_Click()   Check確認 End Sub Private Sub CheckBox3_Click()   Check確認 End Sub Private Sub CheckBox4_Click()   Check確認 End Sub Private Sub Check確認()   Dim i As Long   For i = 1 To 4     If Me.Controls("CheckBox" & i) = False Then Exit For Next   If i = 5 Then     Me.CheckBox5.Value = True   Else     Me.CheckBox5.Value = False   End If End Sub

kidibotkbg
質問者

お礼

回答ありがとうございます CheckBox1~4にチェックが入るとCheckBox5にチェックが入りますが、CheckBox1~4のチェックが外れません 何が原因が考えていたらお礼が遅れてしまいました すみませんでした

関連するQ&A