From: Jon Lewis on
Sorry it was untested and I'd meant to add a Exit For line see below which
should work:

Dim ctl As Control

If Me.cboColor = "Yes" Then
For Each ctl In Me.Controls
If ctl.Tag = "Col" Then
ctl.Enabled = True
End If
Next
Else
For Each ctl In Me.Controls
If ctl.Tag = "Col" Then
If ctl.Value = True Then
If MsgBox("All related check boxes will be unchecked - is
this OK?", vbExclamation + vbYesNo) = vbNo Then
Me.cboColor = "Yes"
Exit Sub
Else
Exit For
End If
End If
End If
Next
For Each ctl In Me.Controls
If ctl.Tag = "Col" Then
ctl.Value = Null
ctl.Enabled = False
End If
Next
End If

Jon

"Kurt Heisler" <heislerkurt(a)gmail.com> wrote in message
news:939ee0f0-7034-4b95-9e45-40973e5ba5e7(a)s13g2000prc.googlegroups.com...
On May 20, 10:36 am, "Jon Lewis" <jon.le...(a)cutthespambtinternet.com>
wrote:
> Yes I think you do need another For Next loop if you are going to warn the
> user *only* if any of the CheckBoxes are checked not least because your
> logic at the moment leaves previously unchecked CheckBoxes disabled. Why
> not warn them anyway something like "Any related checked boxes will be
> unchecked ." I've assumed you want all related CheckBoxes to remain
> Enabled. Try the following:
>
> Dim ctl As Control
>
> If Me.cboColor = "Yes" Then
> For Each ctl In Me.Controls
> If ctl.Tag = "Col" Then
> ctl.Enabled = True
> End If
> Next
> Else
> For Each ctl In Me.Controls
> If ctl.Tag = "Col" Then
> If ctl.Value = True Then
> If MsgBox("All related check boxes will be unchecked - is
> this OK?", vbExclamation + vbYesNo) = vbNo Then
> Me.cboColor = "Yes"
> Exit Sub
> End If
> End If
> End If
> Next
> For Each ctl In Me.Controls
> If ctl.Tag = "Col" Then
> ctl.Value = Null
> ctl.Enabled = False
> End If
> Next
> End If
>
> Jon
>
> "Kurt Heisler" <heislerk...(a)gmail.com> wrote in message
>
> news:de29a19f-5e2a-493d-a197-e4aabf3d790a(a)y6g2000pra.googlegroups.com...
>
> > If the user checks selects 'Yes' from a combo box, I'd like to enable
> > a group of check boxes (all have tag property "col"). If the user
> > selects 'No', I'd like to disable them but, if any are checked, tell
> > the user data will be deleted and then set the checkboxes = Null
> > (assuming the user says okay). My current code triggers the prompt for
> > *each* check box that's checked, rather then looping through them
> > automatically. Do I need to another "For each ..." clause after the
> > first Else statement?
>
> > ###
>
> > Private Sub cboColor_AfterUpdate()
>
> > For Each ctl In Me
> > If ctl.Tag = "col" Then
> > If Me.cboColor.Value = "Yes" Then
> > ctl.Enabled = True
> > Else
> > If ctl.Value = False Then 'nothing has been checked;
> > disable the controls
> > ctl.Enabled = False
> > Else 'something has been checked; tell user it will be
> > deleted
> > iresponse = MsgBox("Changing this from Yes will delete
> > the information in the " & _
> > "related fields." & _
> > Chr(13) & Chr(13) & "Continue?", 4 + 48 + 256, "Delete
> > confirmation")
> > If iresponse = 7 Then ' user said
> > No
> > Me.cboColor.Value = "Yes"
> > Exit Sub
> > Else ' user said Yes
> > ctl.Value = Null
> > ctl.Enabled = False
> > End If
> > End If
> > End If
> > End If
> > Next
> > Set ctl = Nothing
>
> > End Sub
>
> > ###
>
> > Thank you.

Jon:

Your code has the same problem mine has: It prompts the user for
*each* checkbox that's = True. (So if 3 checkboxes are checked, he
gets asked 3 times, "... is this OK?")

mie:

I can't follow how your code comes together. I ignored the first code
you posted, and you came back with this:

> Dim ctl As control
> For Each ctl In Me.Controls
> If ctl.Tag = "Col" Then
> If Me.cboColor = "Yes" Then
> ctl.enabled = True
> Else
> If ctl.value = True Then ctl.value = False
> ctl.enabled = False
> End If
> End If
> Next

So where / how do I incorporate the iresponse ... question for the
user? The above code will change all True checkboxes to False without
first asking the user.

Also:

> For me, i will ask user confirmation once only. Then proceed the
> cancellation process. Imagine if you have 10 check boxes, user will be
> prompted 10 time for confirmation.

That's the problem I'm trying to fix. If I can have Access loop
through the controls automatically it should mean the user gets one
prompt and not, e.g., 10.


From: Kurt Heisler on
Thanks Jon. Works perfectly.

On May 21, 4:40 am, "Jon Lewis" <jon.le...(a)cutthespambtinternet.com>
wrote:
> Sorry it was untested and I'd meant to add a Exit For line see below which
> should work:
>
> Dim ctl As Control
>
> If Me.cboColor = "Yes" Then
>     For Each ctl In Me.Controls
>         If ctl.Tag = "Col" Then
>             ctl.Enabled = True
>         End If
>     Next
> Else
>     For Each ctl In Me.Controls
>         If ctl.Tag = "Col" Then
>             If ctl.Value = True Then
>                 If MsgBox("All related check boxes will be unchecked - is
> this OK?", vbExclamation + vbYesNo) = vbNo Then
>                     Me.cboColor = "Yes"
>                     Exit Sub
>                 Else
>                     Exit For
>                 End If
>             End If
>         End If
>     Next
>     For Each ctl In Me.Controls
>         If ctl.Tag = "Col" Then
>             ctl.Value = Null
>             ctl.Enabled = False
>         End If
>     Next
>  End If
>
> Jon
>
> "Kurt Heisler" <heislerk...(a)gmail.com> wrote in message
>
> news:939ee0f0-7034-4b95-9e45-40973e5ba5e7(a)s13g2000prc.googlegroups.com...
> On May 20, 10:36 am, "Jon Lewis" <jon.le...(a)cutthespambtinternet.com>
> wrote:
>
>
>
> > Yes I think you do need another For Next loop if you are going to warn the
> > user *only* if any of the CheckBoxes are checked not least because your
> > logic at the moment leaves previously unchecked CheckBoxes disabled. Why
> > not warn them anyway something like "Any related checked boxes will be
> > unchecked ." I've assumed you want all related CheckBoxes to remain
> > Enabled. Try the following:
>
> > Dim ctl As Control
>
> > If Me.cboColor = "Yes" Then
> > For Each ctl In Me.Controls
> > If ctl.Tag = "Col" Then
> > ctl.Enabled = True
> > End If
> > Next
> > Else
> > For Each ctl In Me.Controls
> > If ctl.Tag = "Col" Then
> > If ctl.Value = True Then
> > If MsgBox("All related check boxes will be unchecked - is
> > this OK?", vbExclamation + vbYesNo) = vbNo Then
> > Me.cboColor = "Yes"
> > Exit Sub
> > End If
> > End If
> > End If
> > Next
> > For Each ctl In Me.Controls
> > If ctl.Tag = "Col" Then
> > ctl.Value = Null
> > ctl.Enabled = False
> > End If
> > Next
> > End If
>
> > Jon
>
> > "Kurt Heisler" <heislerk...(a)gmail.com> wrote in message
>
> >news:de29a19f-5e2a-493d-a197-e4aabf3d790a(a)y6g2000pra.googlegroups.com...
>
> > > If the user checks selects 'Yes' from a combo box, I'd like to enable
> > > a group of check boxes (all have tag property "col"). If the user
> > > selects 'No', I'd like to disable them but, if any are checked, tell
> > > the user data will be deleted and then set the checkboxes = Null
> > > (assuming the user says okay). My current code triggers the prompt for
> > > *each* check box that's checked, rather then looping through them
> > > automatically. Do I need to another "For each ..." clause after the
> > > first Else statement?
>
> > > ###
>
> > > Private Sub cboColor_AfterUpdate()
>
> > > For Each ctl In Me
> > > If ctl.Tag = "col" Then
> > > If Me.cboColor.Value = "Yes" Then
> > > ctl.Enabled = True
> > > Else
> > > If ctl.Value = False Then 'nothing has been checked;
> > > disable the controls
> > > ctl.Enabled = False
> > > Else 'something has been checked; tell user it will be
> > > deleted
> > > iresponse = MsgBox("Changing this from Yes will delete
> > > the information in the " & _
> > > "related fields." & _
> > > Chr(13) & Chr(13) & "Continue?", 4 + 48 + 256, "Delete
> > > confirmation")
> > > If iresponse = 7 Then ' user said
> > > No
> > > Me.cboColor.Value = "Yes"
> > > Exit Sub
> > > Else ' user said Yes
> > > ctl.Value = Null
> > > ctl.Enabled = False
> > > End If
> > > End If
> > > End If
> > > End If
> > > Next
> > > Set ctl = Nothing
>
> > > End Sub
>
> > > ###
>
> > > Thank you.
>
> Jon:
>
> Your code has the same problem mine has: It prompts the user for
> *each* checkbox that's = True. (So if 3 checkboxes are checked, he
> gets asked 3 times, "... is this OK?")
>
> mie:
>
> I can't follow how your code comes together. I ignored the first code
> you posted, and you came back with this:
>
> > Dim ctl As control
> > For Each ctl In Me.Controls
> >    If ctl.Tag = "Col" Then
> >        If Me.cboColor = "Yes" Then
> >            ctl.enabled = True
> >        Else
> >            If ctl.value = True Then ctl.value = False
> >            ctl.enabled = False
> >        End If
> >    End If
> > Next
>
> So where / how do I incorporate the iresponse ... question for the
> user? The above code will change all True checkboxes to False without
> first asking the user.
>
> Also:
>
> > For me, i will ask user confirmation once only. Then proceed the
> > cancellation process. Imagine if you have 10 check boxes, user will be
> > prompted 10 time for confirmation.
>
> That's the problem I'm trying to fix. If I can have Access loop
> through the controls automatically it should mean the user gets one
> prompt and not, e.g., 10.