MS Access VBA 查看控件的条件格式设置规则当前是否处于活动状态
MS Access VBA to see if a conditional formatting rule is currently active for a control
我有一个条件格式规则,可以根据之前的选择启用某些字段。默认情况下禁用这些字段。一旦启用这些字段,它们也需要输入。但是,由于它们是有条件的,所以我不能在数据库级别要求它们。
我尝试过的是检查提交处理程序是否启用了控件并且不为空。
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
显然始终为假,我想检查给定控件是否有激活的条件格式规则(只有一个)。但到目前为止我还没有发现这样做。可以吗?
由于 CF 的动态特性,我怀疑是否可以确定是否在任何特定时间应用了条件格式。 CF properties/methods 的 None 提供此指标。很可能是为什么找不到示例代码。 CF 规则中用于 enable/disable 的相同条件可用于 VBA 以确定控件的状态。
可以判断控件是否有任何CF规则。
ctl.FormatConditions.Count
只有文本框和组合框可以具有 CF,因此请确保循环代码仅测试这些控件。任何其他内容都会触发“不支持此 属性”错误。
经过几个小时的摸索,我想出了一个使用 SetFocus 方法来确定字段是否启用的方法。禁用的字段无法获得焦点并会引发错误。
这个概念已经包含在一个函数中进行测试,return判断真假。
' 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 工作时已经导致明显的速度下降,我想避免再次 运行 该表达式。
另请注意,这并没有提供问题的答案,但确实解决了我的问题:)
我有一个条件格式规则,可以根据之前的选择启用某些字段。默认情况下禁用这些字段。一旦启用这些字段,它们也需要输入。但是,由于它们是有条件的,所以我不能在数据库级别要求它们。
我尝试过的是检查提交处理程序是否启用了控件并且不为空。
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
显然始终为假,我想检查给定控件是否有激活的条件格式规则(只有一个)。但到目前为止我还没有发现这样做。可以吗?
由于 CF 的动态特性,我怀疑是否可以确定是否在任何特定时间应用了条件格式。 CF properties/methods 的 None 提供此指标。很可能是为什么找不到示例代码。 CF 规则中用于 enable/disable 的相同条件可用于 VBA 以确定控件的状态。
可以判断控件是否有任何CF规则。
ctl.FormatConditions.Count
只有文本框和组合框可以具有 CF,因此请确保循环代码仅测试这些控件。任何其他内容都会触发“不支持此 属性”错误。
经过几个小时的摸索,我想出了一个使用 SetFocus 方法来确定字段是否启用的方法。禁用的字段无法获得焦点并会引发错误。
这个概念已经包含在一个函数中进行测试,return判断真假。
' 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 工作时已经导致明显的速度下降,我想避免再次 运行 该表达式。
另请注意,这并没有提供问题的答案,但确实解决了我的问题:)