Vba 如何循环遍历窗体中的所有控件,包括子窗体中的控件-Access 2007

Vba 如何循环遍历窗体中的所有控件,包括子窗体中的控件-Access 2007,vba,ms-access,ms-access-2007,Vba,Ms Access,Ms Access 2007,正如我问题的标题所示,如何能够循环遍历表单中的所有控件,包括子表单 例如,我使用下面的子程序设置带有标签的控件的背景色* Public Sub colCtrlReq(frm As Form) ' Sets background color for required field -> Tag = * Dim setColour As String setColour = RGB(255, 244, 164) Dim ctl As Control For Each ctl In frm.Co

正如我问题的标题所示,如何能够循环遍历表单中的所有控件,包括子表单

例如,我使用下面的子程序设置带有标签的控件的背景色*

Public Sub colCtrlReq(frm As Form)
'  Sets background color for required field -> Tag = *
Dim setColour As String
setColour = RGB(255, 244, 164)
Dim ctl As Control
For Each ctl In frm.Controls
        If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
            If InStr(1, ctl.Tag, "*") <> 0 Then
                ctl.BackColor = setColour
            End If
        End If
Next ctl
Set ctl = Nothing
End Sub
Public Sub-colCtrlReq(格式为frm)
'为必填字段设置背景色->标记=*
颜色如弦
SetColor=RGB(255、244、164)
Dim-ctl作为对照
对于frm.控件中的每个ctl
如果ctl.ControlType=acTextBox或ctl.ControlType=ACCOMBOX或ctl.ControlType=acListBox,则
如果指令(1,控制标签,“*”)为0,则
ctl.BackColor=setcolor
如果结束
如果结束
下一个ctl
设置ctl=Nothing
端接头
如何改变它以捕获子窗体中的控件? 提前感谢您的帮助或指点

干杯
Noel

访问子窗体控件的窗体属性的控件集合

注意,子窗体控件的名称可能与保存的窗体对象的名称不同

如果子窗体控件名为SubformControlName,请从此处开始:

For Each ctl In frm!SubformControlName.Form.Controls
    Debug.Print ctl.Name
Next
更新:根据您的评论,以下是我认为您正在寻找的内容

如果您事先不知道子窗体控件的名称,可以在运行时确定哪些窗体控件是子窗体控件

For Each ctl In frm.Controls
    If TypeName(ctl) = "SubForm" Then
        Debug.Print ctl.Name & " is a SubForm"
        For Each ctlSub in ctl.Form.Controls
            Debug.Print ctlSub.Name
        Next 
    End If
Next
可以使用递归

Public Sub colCtrlReq(frm As Form)
''  Sets background color for required field -> Tag = *
Dim setColour As String
setColour = RGB(255, 244, 164)
Dim ctl As Control
For Each ctl In frm
        If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox _
            Or ctl.ControlType = acListBox Then
            If InStr(1, ctl.Tag, "*") <> 0 Then
                ctl.BackColor = setColour
            End If
        ElseIf ctl.ControlType = acSubform Then
            colCtrlReq frm(ctl.Name).Form

        End If
Next ctl
Set ctl = Nothing
End Sub
Public Sub-colCtrlReq(格式为frm)
“”为必填字段设置背景色->标记=*
颜色如弦
SetColor=RGB(255、244、164)
Dim-ctl作为对照
对于frm中的每个ctl
如果ctl.ControlType=acTextBox或ctl.ControlType=ACCOMBOX_
或者ctl.ControlType=acListBox,然后
如果指令(1,控制标签,“*”)为0,则
ctl.BackColor=setcolor
如果结束
ElseIf ctl.ControlType=acSubform然后
colCtrlReq frm(控制名称).Form
如果结束
下一个ctl
设置ctl=Nothing
端接头

干杯。如果表单中没有子表单的名称(可能是名称),那么如何循环使用这些控件呢?很好的一个Remou,这与我所追求的技术完全相同。@Remou有吗?:-)回答得很好。我注意到您可以将
frm(ctl.Name).Form
简化为
ctl.Form
(已在Access 2016中验证)。但如何调用此过程?使用加载事件窗体还是其他任何东西?为每个控件调用这个过程使用on-click或so事件是非常困难的!其他人已经回答了我们的问题,但您确实应该将其更改为“frm.Controls中的每个ctl”。表单的默认集合实际上是控件和字段集合的联合,因此您编写的内容可能会产生意外的结果。谢谢David的建议,我已更正了上述代码。请重新注释“frm中的每个ctl”--我无法在Access 2010中重现此问题。