微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MS Access VBA 以查看条件格式规则当前是否对控件处于活动状态

如何解决MS Access VBA 以查看条件格式规则当前是否对控件处于活动状态

我有一个条件格式规则,可以根据之前的选择启用某些字段。认情况下禁用这些字段。启用这些字段后,它们也需要输入。但是,由于它们是有条件的,因此我无法在数据库级别要求它们。

我尝试的是检查提交处理程序是否启用了控件并且不为空。

Public Sub SaveButton_Click()
    For Each ctl In Me.Controls
        If (ctl.Tag = "ConditinallyrequiredField") Then
            If (ctl.Enabled = True) Then
                Debug.Print "This is never reached"
                ' Check for empty values.
                If (Len(ctl.Value & vbNullString) = 0) Then
                    MsgBox "One or more required fields are missing input values."
                    GoTo stopSubmit
                End If
            End If
        End If
    Next ctl

    ... Do submit
End Sub

但是 ctl.Enabled 总是错误的,无论我在什么时间点检查它。所以看起来条件格式覆盖了它而不影响实际属性

因此,由于 ctl.Enabled 显然始终为假,我想检查是否有针对给定控件的条件格式规则处于活动状态(只有一个)。但到目前为止我还没有发现这样做。可以吗?

解决方法

经过几个小时的摸索,我想出了一种方法,该方法使用 SetFocus 方法来确定某个字段是否已启用。禁用的字段无法获得焦点并会引发错误。

这个概念已经被封装在一个函数中来测试并返回 True 或 False。

' Helper function. Returns True if the textfield could receive focus.
Private Function TestEnabled(ctl As Control) As Boolean
    On Error GoTo noFocus
    ' Assume the textfield can be focussed.
    TestEnabled = True
    ' Try setting the focus.
    ctl.SetFocus
Exit Function
noFocus:
    ' If the textfield could not receive focus it is not enabled.
    TestEnabled = False
End Function

在提交处理程序中,它被包装在一个 if 语句中以进行测试。如果该字段已启用但为空,则代码会中断但该字段仍保持聚焦。这是一个额外的奖励,可以直接指导缺失的字段。 测试完所有字段后,焦点将重置为提交按钮(就像用户单击它一样)以防止检查的最后一个字段保持焦点。

' Submit handler
Public Sub SaveButton_Click()
    For Each ctl In Me.Controls
        ' Only test the tagged fields to prevent labels,etc. from getting tested.
        If (ctl.Tag = "ConditinallyRequiredField") Then
            If (TestEnabled(ctl)) Then
                ' Check for empty values.
                If (Len(ctl.Value & vbNullString) = 0) Then
                    MsgBox "One or more required fields are missing input values."
                    GoTo stopSubmit
                End If
            End If
        End If
    Next ctl
    ' Set Focus to the save button again.
    Me.SaveButton.SetFocus

    ' ... Do submit
End Sub

请注意,June7 建议在 VBA 中再次从条件格式中简单地测试相同的表达式也有效。但由于它基于 DLookup,在通过 VPN 工作时已经导致明显的减速,我想避免再次运行该表达式。

另请注意,这并没有提供问题的答案,但确实解决了我的问题:)

,

由于 CF 的动态特性,我怀疑能否确定是否在任何特定时间应用条件格式。没有 CF 属性/方法提供此指标。很可能为什么没有找到示例代码。 在 CF 规则中用于启用/禁用的相同条件可在 VBA 中用于确定控件的状态。

可以判断控件是否有任何CF规则。
ctl.FormatConditions.Count
只有文本框和组合框可以有 CF,所以确保循环代码只测试这些控件。其他任何事情都会触发“不支持此属性”错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。