Home |
Search |
Today's Posts |
#1
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
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 |
#2
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
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 "Michelle" skrev i meddelelsen ... 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 |
#3
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
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 "Per Jessen" wrote in message ... 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 "Michelle" skrev i meddelelsen ... 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 |
#4
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
..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 Michelle wrote: 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 -- Dave Peterson |
#5
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
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.) Dave Peterson wrote: .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 Michelle wrote: 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 -- Dave Peterson -- Dave Peterson |
#6
Posted to microsoft.public.excel.programming
|
|||
|
|||
CheckBox to tick other CheckBoxes
Thanks - you're a star.
M "Dave Peterson" wrote in message ... 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.) Dave Peterson wrote: .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 Michelle wrote: 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 -- Dave Peterson -- Dave Peterson |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Forum | |||
Macro or VBA Code to un tick CheckBox | Excel Programming | |||
Alternative to a tick in a checkbox | Excel Discussion (Misc queries) | |||
Macro to tick checkbox automatically | Excel Discussion (Misc queries) | |||
Checkbox to be marked with a cross rather than a tick | New Users to Excel | |||
I would like to have a cross in my checkbox rather than a tick | Excel Programming |