こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

エクセルVBAのユーザーフォームのチェックボックスについて教えてください。
frame1の中にCheckbox1~5があるのですが、以下のように指示したいです。

Checkbox1~4は自由にチェックできるようにしておいて、Checkbox1~4の全てにチェックが入った場合に、Checkbox1~4の全てチェックを外し(False)、その代わりCheckbox5を自動的にチェックを入れたいです(True)。
CommandButtonなどをクリックして初めて変化するのではなく、ユーザーフォームにチェックを入れている間に自動的にチェックを入れたり外したいです。

特に「Checkbox1~4の全てにチェックが入った場合」というのを、どこに入力するのか分かりませんでした。
1箇所だけならPrivate Sub CheckBox1_Click()と始めたら良いんだとおもうのですが。。。
よろしくお願いします

投稿日時 - 2013-09-19 22:32:48

QNo.8271529

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2013-09-21 05:24:44

お礼

回答ありがとうございます

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

投稿日時 - 2013-09-21 22:50:28

ANo.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

投稿日時 - 2013-09-20 02:31:12

お礼

回答ありがとうございます

お礼が遅くなりすみません

投稿日時 - 2013-09-21 23:05:13

ANo.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

投稿日時 - 2013-09-19 23:00:45

お礼

回答ありがとうございます

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

投稿日時 - 2013-09-21 22:41:13

あなたにオススメの質問