looping through controls - for each ... next

K

Kurt Heisler

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

Rob Parker

Why not just show a warning message and get the response, then only run the
code if the user has agreed that the data can be changed.

HTH,

Rob
 
J

Jon Lewis

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
 
K

Kurt Heisler

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

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

Jon Lewis

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

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

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

Kurt Heisler

Thanks Jon. Works perfectly.

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






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:


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:


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.
 

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