CheckBox to tick other CheckBoxes

M

Michelle

Hello, I have a userform with checkboxes for each of four years (Y0, Y1, Y2
& Y3)
I want to be able to tick them all by ticking the 'tick-all' checkbox

Similarly, if I deselect any of them the 'tick-all' box should be
automatically unchecked
and if I tick them all manually, the 'tick-all' box should be automatically
checked

I have seen this setup before - so I know it's possible.

My problem is that the event procedures are all triggering each other and so
it's a bit of a mess.

I've tried EnableEvents = false, but it doesn't do what I want

A sample of my code is below, but does anyone know a way to make it work?
please?

'===========================
Private Sub chkHeadAll_Change()
Application.EnableEvents = False
chkHeadY0.Value = chkHeadAll.Value
chkHeadY1.Value = chkHeadAll.Value
chkHeadY2.Value = chkHeadAll.Value
chkHeadY3.Value = chkHeadAll.Value
Application.EnableEvents = True
End Sub

Private Sub chkHeadY0_Change()
Application.EnableEvents = False
If chkHeadY0.Value And chkHeadY1.Value And chkHeadY2.Value And
chkHeadY3.Value Then chkHeadAll.Value = True
If Not chkHeadY0.Value Or Not chkHeadY1.Value Or Not chkHeadY2.Value Or
Not chkHeadY3.Value Then chkHeadAll.Value = False
Application.EnableEvents = True
End Sub

Private Sub chkHeadY1_Change()
Application.EnableEvents = False
If chkHeadY0.Value And chkHeadY1.Value And chkHeadY2.Value And
chkHeadY3.Value Then chkHeadAll.Value = True
If Not chkHeadY0.Value Or Not chkHeadY1.Value Or Not chkHeadY2.Value Or
Not chkHeadY3.Value Then chkHeadAll.Value = False
Application.EnableEvents = True
End Sub
'===========================

Thanks


M
 
P

Per Jessen

Hi

Two things:

In chkHeadAll_Change(), test if chkHeadAll is true, and if it is set all
years true, else do nothing.

In each year change sub, you should only check on the current checkbox:

If Not chkHeadY0.Value Then chkHeadAll.Value = False


See my example below:

Private Sub CheckBox1_change()
If Me.CheckBox1 = True Then
Me.CheckBox2.Value = True
Me.CheckBox3.Value = True
Me.CheckBox4.Value = True
End If
End Sub

Private Sub CheckBox2_change()
If Me.CheckBox2 And Me.CheckBox3 And Me.CheckBox4 Then Me.CheckBox1 = True
If Not Me.CheckBox2 Then Me.CheckBox1 = False
End Sub

Private Sub CheckBox3_change()
If Me.CheckBox2 And Me.CheckBox3 And Me.CheckBox4 Then Me.CheckBox1 = True
If Not Me.CheckBox3 Then Me.CheckBox1 = False
End Sub

Private Sub CheckBox4_change()
If Me.CheckBox2 And Me.CheckBox3 And Me.CheckBox4 Then Me.CheckBox1 = True
If Not Me.CheckBox4 Then Me.CheckBox1 = False
End Sub

Hopes this helps.
...
Per
 
M

Michelle

When I run the check box1 change event (starting with all the boxes
unticked), it checks the first one then doesn't change the others, I don't
get why it doesn't work

M
 
D

Dave Peterson

..enableevents won't work (as you've seen). You have to keep track yourself.

Since you named the 4 checkboxes nicely (chkHeadY#), this worked ok for me:

Option Explicit
Dim BlkProc As Boolean
Const MaxCheckBoxes As Long = 4
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub chkHeadAll_Change()

If BlkProc = True Then
Exit Sub
End If

BlkProc = True
chkHeadY0.Value = chkHeadAll.Value
chkHeadY1.Value = chkHeadAll.Value
chkHeadY2.Value = chkHeadAll.Value
chkHeadY3.Value = chkHeadAll.Value
BlkProc = False
End Sub
Private Sub chkHeadY0_Change()

Dim HowManyChecked As Long

If BlkProc = True Then
Exit Sub
End If

HowManyChecked = CountIndividualYears

BlkProc = True
If HowManyChecked = MaxCheckBoxes Then
Me.chkHeadAll = True
Else
Me.chkHeadAll = False
End If
BlkProc = False

End Sub
Private Sub chkHeadY1_Change()

Dim HowManyChecked As Long

If BlkProc = True Then
Exit Sub
End If

HowManyChecked = CountIndividualYears

BlkProc = True
If HowManyChecked = MaxCheckBoxes Then
Me.chkHeadAll = True
Else
Me.chkHeadAll = False
End If
BlkProc = False

End Sub
Private Sub chkHeadY2_Change()

Dim HowManyChecked As Long

If BlkProc = True Then
Exit Sub
End If

HowManyChecked = CountIndividualYears

BlkProc = True
If HowManyChecked = MaxCheckBoxes Then
Me.chkHeadAll = True
Else
Me.chkHeadAll = False
End If
BlkProc = False

End Sub
Private Sub chkHeadY3_Change()

Dim HowManyChecked As Long

If BlkProc = True Then
Exit Sub
End If

HowManyChecked = CountIndividualYears

BlkProc = True
If HowManyChecked = MaxCheckBoxes Then
Me.chkHeadAll = True
Else
Me.chkHeadAll = False
End If
BlkProc = False

End Sub
Function CountIndividualYears() As Long

Dim iCtr As Long
Dim myCount As Long

myCount = 0
For iCtr = 0 To MaxCheckBoxes - 1
If Me.Controls("chkHeadY" & iCtr).Value = True Then
myCount = myCount + 1
End If
Next iCtr

CountIndividualYears = myCount

End Function
 
D

Dave Peterson

If you decide to change the number of years, you may want to use this:

Private Sub chkHeadAll_Change()

Dim iCtr as long

If BlkProc = True Then
Exit Sub
End If

BlkProc = True
For iCtr = 0 To MaxCheckBoxes - 1
Me.Controls("chkHeadY" & iCtr).Value = chkHeadAll.Value
Next iCtr
BlkProc = false

End Sub

(I didn't notice it before.)
 
M

Michelle

Thanks - you're a star.

M

Dave Peterson said:
If you decide to change the number of years, you may want to use this:

Private Sub chkHeadAll_Change()

Dim iCtr as long

If BlkProc = True Then
Exit Sub
End If

BlkProc = True
For iCtr = 0 To MaxCheckBoxes - 1
Me.Controls("chkHeadY" & iCtr).Value = chkHeadAll.Value
Next iCtr
BlkProc = false

End Sub

(I didn't notice it before.)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top