Vba 列出访问表单上所有控件的格式条件

Vba 列出访问表单上所有控件的格式条件,vba,ms-access,Vba,Ms Access,是否可以列出表单上所有控件的条件格式?我希望能够列出所有现有条件,以便生成代码来添加/删除现有条件。我继承了一些复杂的表单,我想知道我在处理什么,然后生成一些代码来切换条件格式,这些代码会降低连续表单的导航速度 此Excel VBA示例显示了我希望访问的类似格式。 只有文本框和组合框具有条件格式 无法列出任何属性来显示控件的条件格式规则。每个规则都有可以列出的属性。单个特定控件的列表示例: Private Sub Command25_Click() Dim x As Integer With M

是否可以列出表单上所有控件的条件格式?我希望能够列出所有现有条件,以便生成代码来添加/删除现有条件。我继承了一些复杂的表单,我想知道我在处理什么,然后生成一些代码来切换条件格式,这些代码会降低连续表单的导航速度

此Excel VBA示例显示了我希望访问的类似格式。

只有文本框和组合框具有条件格式

无法列出任何属性来显示控件的条件格式规则。每个规则都有可以列出的属性。单个特定控件的列表示例:

Private Sub Command25_Click()
Dim x As Integer
With Me.tbxRate
For x = 0 To .FormatConditions.Count - 1
    Debug.Print .FormatConditions(x).BackColor
    Debug.Print .FormatConditions(x).Expression1
    Debug.Print .FormatConditions(x).FontBold
Next
End With
End Sub
此示例的输出为:

 2366701 
20
False
这些是当字段值大于20时将backcolor设置为红色的规则的属性


是的,代码可以在表单上的控件之间循环,测试文本框和组合框类型,确定是否存在CF规则和输出属性。

从@June7的示例和Garry Robinson发现的一个示例中得到一些启发,我编写了一个过程来回答我的问题

Public Sub ListConditionalFormats(frmForm As Form)
' Show all the Textbox and Combobox controls on the past form object (assuming the form is open).
' Output the FormatCondtion properties to the immediate window in a format that is
' suitable to be copied into VBA to recreate the conditional formatting.

    Dim ctl             As Control
    Dim i               As Integer
    Dim bolControlEnabled As Boolean
    Dim bolFormatEnabled As Boolean

    On Error GoTo ErrorHandler

    For Each ctl In frmForm.Controls

        If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox Then
            With ctl
                If .FormatConditions.Count > 0 Then
                    'Debug.Print vbCr & "' " & ctl.Name, "Count = " & .FormatConditions.Count
                    For i = 0 To .FormatConditions.Count - 1

                        ' Generate code that can recreate each FormatCondition
                        Debug.Print ctl.Name & ".FormatConditions.Delete"
                        Debug.Print ctl.Name & ".FormatConditions.Add " & DecodeType(.FormatConditions(i).Type) _
                                    & ", " & DecodeOp(.FormatConditions(i).Operator) _
                                    & ", """ & .FormatConditions(i).Expression1 & """" _
                                    & IIf(Len(.FormatConditions(i).Expression2) > 0, ", " & .FormatConditions(i).Expression2, "")
                        Debug.Print "With " & ctl.Name & ".FormatConditions.Item(" & ctl.Name & ".FormatConditions.Count-1)"

                        bolControlEnabled = ctl.Enabled
                        bolFormatEnabled = .FormatConditions(i).Enabled
                        'Debug.Print bolControlEnabled <> bolFormatEnabled, bolControlEnabled, bolFormatEnabled
                        If bolControlEnabled <> bolFormatEnabled Then    ' <- This sometimes fails.  BS 2/9/2020
                            'If ctl.Enabled <> .FormatConditions(i).Enabled Then ' <- This sometimes fails.  BS 2/9/2020
                            Debug.Print vbTab & ".Enabled          = " & .FormatConditions(i).Enabled; Tab(40); "' " & ctl.Name & ".Enabled=" & ctl.Enabled
                        End If

                        If ctl.ForeColor <> .FormatConditions(i).ForeColor Then
                            Debug.Print vbTab & ".ForeColor        = " & .FormatConditions(i).ForeColor; Tab(40); "' " & ctl.Name & ".ForeColor=" & ctl.ForeColor
                        End If
                        If ctl.BackColor <> .FormatConditions(i).BackColor Then
                            Debug.Print vbTab & ".BackColor        = " & .FormatConditions(i).BackColor; Tab(40); "' " & ctl.Name & ".BackColor=" & ctl.BackColor
                        End If
                        If ctl.FontBold <> .FormatConditions(i).FontBold Then
                            Debug.Print vbTab & ".FontBold         = " & .FormatConditions(i).FontBold; Tab(40); "' " & ctl.Name & ".FontBold=" & ctl.FontBold
                        End If
                        If ctl.FontItalic <> .FormatConditions(i).FontItalic Then
                            Debug.Print vbTab & ".FontItalic       = " & .FormatConditions(i).FontItalic; Tab(40); "' " & ctl.Name & ".FontItalic=" & ctl.FontItalic
                        End If
                        If ctl.FontUnderline <> .FormatConditions(i).FontUnderline Then
                            Debug.Print vbTab & ".FontUnderline    = " & .FormatConditions(i).FontUnderline; Tab(40); "' " & ctl.Name & ".FontUnderline=" & ctl.FontUnderline
                        End If

                        If .FormatConditions(i).Type = 3 Then    ' acDataBar
                            Debug.Print vbTab & ".LongestBarLimit  = " & .FormatConditions(i).LongestBarLimit
                            Debug.Print vbTab & ".LongestBarValue  = " & .FormatConditions(i).LongestBarValue
                            Debug.Print vbTab & ".ShortestBarLimit = " & .FormatConditions(i).ShortestBarLimit
                            Debug.Print vbTab & ".ShortestBarValue = " & .FormatConditions(i).ShortestBarValue
                            Debug.Print vbTab & ".ShowBarOnly      = " & .FormatConditions(i).ShowBarOnly
                        End If
                        Debug.Print "End With" & vbCr
                    Next
                End If
            End With
        End If
    Next

    Beep

Exit_Sub:
    Exit Sub

ErrorHandler:
    MsgBox "Error #" & Err.Number & " - " & Err.Description & vbCrLf & "in procedure ListConditionalFormats" _
        & IIf(Erl > 0, vbCrLf & "Line #: " & Erl, "")
    GoTo Exit_Sub
    Resume Next
    Resume
End Sub

Function DecodeType(TypeProp As Integer) As String
' You heed this are there are 4 different ways to setup a CondtionalFormat
' https://vb123.com/listing-conditional-formats

    Select Case TypeProp
        Case 0
            DecodeType = "acFieldValue"
        Case 1
            DecodeType = "acExpression"
        Case 2
            DecodeType = "acFieldHasFocus"
        Case 3
            DecodeType = "acDataBar"
    End Select

End Function

Function DecodeOp(OpProp As Integer) As String
' You need this becuase equations can comprise of = > <> between
' https://vb123.com/listing-conditional-formats

    Select Case OpProp
        Case 0
            DecodeOp = "acBetween"
        Case 1
            DecodeOp = "acNotBetween"
        Case 2
            DecodeOp = "acEqual"
        Case 3
            DecodeOp = "acNotEqual"
        Case 4
            DecodeOp = "acGreaterThan"
        Case 5
            DecodeOp = "acLessThan"
        Case 6
            DecodeOp = "acGreaterThanOrEqual"
        Case 7
            DecodeOp = "acLessThanOrEqual"
    End Select

End Function
这是即时窗口中的输出。这已准备好粘贴到模块中

txtRowColor.FormatConditions.Delete
txtRowColor.FormatConditions.Add acExpression, acBetween, "[txtCurrent_Equipment_List_ID]=[txtEquipment_List_ID]"
With txtRowColor.FormatConditions.Item(txtRowColor.FormatConditions.Count-1)
    .Enabled          = True           ' txtRowColor.Enabled=False
    .ForeColor        = 0              ' txtRowColor.ForeColor=-2147483640
    .BackColor        = 10092543       ' txtRowColor.BackColor=11850710
End With
您可以从打开表单上的单击事件测试此子项。在检查布尔
.Enabled
属性时,即使我先将值存储到布尔变量中,也会出现一些误报。我不知道为什么,我正在研究它,但这超出了这个问题的范围

Public Sub ListConditionalFormats(frmForm As Form)
' Show all the Textbox and Combobox controls on the past form object (assuming the form is open).
' Output the FormatCondtion properties to the immediate window in a format that is
' suitable to be copied into VBA to recreate the conditional formatting.

    Dim ctl             As Control
    Dim i               As Integer
    Dim bolControlEnabled As Boolean
    Dim bolFormatEnabled As Boolean

    On Error GoTo ErrorHandler

    For Each ctl In frmForm.Controls

        If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox Then
            With ctl
                If .FormatConditions.Count > 0 Then
                    'Debug.Print vbCr & "' " & ctl.Name, "Count = " & .FormatConditions.Count
                    For i = 0 To .FormatConditions.Count - 1

                        ' Generate code that can recreate each FormatCondition
                        Debug.Print ctl.Name & ".FormatConditions.Delete"
                        Debug.Print ctl.Name & ".FormatConditions.Add " & DecodeType(.FormatConditions(i).Type) _
                                    & ", " & DecodeOp(.FormatConditions(i).Operator) _
                                    & ", """ & .FormatConditions(i).Expression1 & """" _
                                    & IIf(Len(.FormatConditions(i).Expression2) > 0, ", " & .FormatConditions(i).Expression2, "")
                        Debug.Print "With " & ctl.Name & ".FormatConditions.Item(" & ctl.Name & ".FormatConditions.Count-1)"

                        bolControlEnabled = ctl.Enabled
                        bolFormatEnabled = .FormatConditions(i).Enabled
                        'Debug.Print bolControlEnabled <> bolFormatEnabled, bolControlEnabled, bolFormatEnabled
                        If bolControlEnabled <> bolFormatEnabled Then    ' <- This sometimes fails.  BS 2/9/2020
                            'If ctl.Enabled <> .FormatConditions(i).Enabled Then ' <- This sometimes fails.  BS 2/9/2020
                            Debug.Print vbTab & ".Enabled          = " & .FormatConditions(i).Enabled; Tab(40); "' " & ctl.Name & ".Enabled=" & ctl.Enabled
                        End If

                        If ctl.ForeColor <> .FormatConditions(i).ForeColor Then
                            Debug.Print vbTab & ".ForeColor        = " & .FormatConditions(i).ForeColor; Tab(40); "' " & ctl.Name & ".ForeColor=" & ctl.ForeColor
                        End If
                        If ctl.BackColor <> .FormatConditions(i).BackColor Then
                            Debug.Print vbTab & ".BackColor        = " & .FormatConditions(i).BackColor; Tab(40); "' " & ctl.Name & ".BackColor=" & ctl.BackColor
                        End If
                        If ctl.FontBold <> .FormatConditions(i).FontBold Then
                            Debug.Print vbTab & ".FontBold         = " & .FormatConditions(i).FontBold; Tab(40); "' " & ctl.Name & ".FontBold=" & ctl.FontBold
                        End If
                        If ctl.FontItalic <> .FormatConditions(i).FontItalic Then
                            Debug.Print vbTab & ".FontItalic       = " & .FormatConditions(i).FontItalic; Tab(40); "' " & ctl.Name & ".FontItalic=" & ctl.FontItalic
                        End If
                        If ctl.FontUnderline <> .FormatConditions(i).FontUnderline Then
                            Debug.Print vbTab & ".FontUnderline    = " & .FormatConditions(i).FontUnderline; Tab(40); "' " & ctl.Name & ".FontUnderline=" & ctl.FontUnderline
                        End If

                        If .FormatConditions(i).Type = 3 Then    ' acDataBar
                            Debug.Print vbTab & ".LongestBarLimit  = " & .FormatConditions(i).LongestBarLimit
                            Debug.Print vbTab & ".LongestBarValue  = " & .FormatConditions(i).LongestBarValue
                            Debug.Print vbTab & ".ShortestBarLimit = " & .FormatConditions(i).ShortestBarLimit
                            Debug.Print vbTab & ".ShortestBarValue = " & .FormatConditions(i).ShortestBarValue
                            Debug.Print vbTab & ".ShowBarOnly      = " & .FormatConditions(i).ShowBarOnly
                        End If
                        Debug.Print "End With" & vbCr
                    Next
                End If
            End With
        End If
    Next

    Beep

Exit_Sub:
    Exit Sub

ErrorHandler:
    MsgBox "Error #" & Err.Number & " - " & Err.Description & vbCrLf & "in procedure ListConditionalFormats" _
        & IIf(Erl > 0, vbCrLf & "Line #: " & Erl, "")
    GoTo Exit_Sub
    Resume Next
    Resume
End Sub

Function DecodeType(TypeProp As Integer) As String
' You heed this are there are 4 different ways to setup a CondtionalFormat
' https://vb123.com/listing-conditional-formats

    Select Case TypeProp
        Case 0
            DecodeType = "acFieldValue"
        Case 1
            DecodeType = "acExpression"
        Case 2
            DecodeType = "acFieldHasFocus"
        Case 3
            DecodeType = "acDataBar"
    End Select

End Function

Function DecodeOp(OpProp As Integer) As String
' You need this becuase equations can comprise of = > <> between
' https://vb123.com/listing-conditional-formats

    Select Case OpProp
        Case 0
            DecodeOp = "acBetween"
        Case 1
            DecodeOp = "acNotBetween"
        Case 2
            DecodeOp = "acEqual"
        Case 3
            DecodeOp = "acNotEqual"
        Case 4
            DecodeOp = "acGreaterThan"
        Case 5
            DecodeOp = "acLessThan"
        Case 6
            DecodeOp = "acGreaterThanOrEqual"
        Case 7
            DecodeOp = "acLessThanOrEqual"
    End Select

End Function
公共子列表条件格式(FRM格式为表单)
'显示过去表单对象上的所有Textbox和Combobox控件(假设表单已打开)。
'将FormatCondition属性以
'适合复制到VBA以重新创建条件格式。
Dim-ctl作为对照
作为整数的Dim i
Dim BOLControl已启用为布尔值
Dim BOLFORMAT已启用为布尔值
关于错误转到错误处理程序
对于frmForm.控件中的每个ctl
如果TypeOf ctl是TextBox或TypeOf ctl是ComboBox,则
带ctl
如果.FormatConditions.Count>0,则
'Debug.Print vbCr&'“&ctl.Name,”Count=“&.FormatConditions.Count
对于i=0到.FormatConditions.Count-1
'生成可以重新创建每个格式条件的代码
Debug.Print ctl.Name&“.FormatConditions.Delete”
Debug.Print ctl.Name&“.FormatConditions.Add”&DecodeType(.FormatConditions(i).Type)_
&“,”和DecodeOp(.FormatConditions(i).Operator)_
&“,”&.FormatConditions(i).Expression1&“_
&IIf(Len(.FormatConditions(i).Expression2)>0,“,”和.FormatConditions(i).Expression2,”)
Debug.Print“带有”&ctl.Name&“.FormatConditions.Item(&ctl.Name&“.FormatConditions.Count-1)”
bolControlEnabled=ctl.Enabled
bolFormatEnabled=.FormatConditions(i).Enabled
'Debug.Print bolControlEnabled bolFormatEnabled,bolControlEnabled,bolFormatEnabled
如果启用了bolControlEnabled bolFormatEnabled,则“介于
' https://vb123.com/listing-conditional-formats
选择Case OpProp
案例0
DecodeOp=“acBetween”
案例1
DecodeOp=“acNotBetween”
案例2
DecodeOp=“acEqual”
案例3
DecodeOp=“acNotEqual”
案例4
DecodeOp=“acGreaterThan”
案例5
DecodeOp=“acLessThan”
案例6
DecodeOp=“acGreaterThanOrEqual”
案例7
DecodeOp=“acLessThanOrEqual”
结束选择
端函数