【问题标题】:If control is not visible, set value to null (access VBA)如果控件不可见,则将值设置为 null(访问 VBA)
【发布时间】:2017-08-11 03:46:33
【问题描述】:

我有一个带有许多控件的表单。但是,如果用户将选项按钮标记为“未到期”,则其中许多字段将设置为不可见。最终我不希望这些隐藏字段存储任何值,但我不希望值在保存表单之前消失(这样如果有人不小心点击“未到期”,它不会删除所有信息)。这是我的代码——设置为在表单更新之前在所有控件上运行。

它告诉我“对象不支持此属性或方法”并在我调试时突出显示 ctl.Value = null。知道我可以做些什么来完成这项工作吗?

Dim ctl As Control
    If Me.optPayDue = 2 Then
        For Each ctl In Me.Controls
            If ctl.Visible = False Then ctl.Value = Null
        Next ctl
    End If

【问题讨论】:

  • 对 Access 不太熟悉,所以我可能在谈论我的...mug,但我不认为Null 是分配控件的有效值。 If ctl.Visible = False Then 也应该是 If Not ctl.Visible Then

标签: ms-access vba


【解决方案1】:

您收到此错误的原因是因为 Controls 集合中包含的内容例如没有 Value 属性的子表单、标签、EmptyCells 等。

您想在对其进行操作之前检查您为其设置值的事物是否具有Value 属性。

Dim ValueControls As New Dictionary
ValueControls.Add "TextBox", "TextBox"
ValueControls.Add "CheckBox", "CheckBox"
ValueControls.Add "ComboBox", "ComboBox"
ValueControls.Add "ListBox", "ListBox"
ValueControls.Add "OptionButton", "OptionButton"

Dim ctl As Control
If Me.optPayDue = 2 Then
    For Each ctl In Me.Controls
        If Not ctl.Visible and ValueControls.Exists(TypeName(ctl)) Then 
            ctl.Value = Null
        End If
    Next ctl
End If

要使用Dictionary 类,您需要添加对Microsoft Scripting Runtime 的引用(C:\Windows\SysWOW64\scrrun.dll)

【讨论】:

  • Dim ValueControls As New Dictionary 给我编译错误“未定义用户定义类型”:/
  • 如果我只是转到工具 > 参考并检查 Microsoft 脚本运行时,该程序是否仍能在其他人的计算机上正常运行,还是我必须在代码中明确引用它?它有效,但我无法弄清楚如何在我的代码中引用它:)
  • 实际上,当我执行“Dim ValueControls As Object”,然后执行“Set ValueControls = CreateObject("Scripting.Dictionary")”,然后执行 ValueControls.Add 代码时,它似乎有效。感谢您的帮助!
  • @Eleyna 您不需要使用后期绑定(CreateObject("Scripting.Dictionary"))。此参考应该适用于任何人的计算机,因为它带有 Windows。我想知道您无法声明为Dictionary 的原因是否是因为其他地方存在编译错误。您是否在每个模块/类中设置(并自动设置)Option Explicit?你的项目编译了吗?
  • 我没有将它设置为一个类的显式,因为它不允许我关闭和打开我的警告,但除此之外,是的。为所有其他类和模块设置显式。
【解决方案2】:

另一种方法是清除所有在 for 循环中没有 .Value 的控件。假设它只是文本框,您可以执行以下操作

    Dim ctl As Control
    If Me.optPayDue = 2 Then
        For Each ctl In Me.Controls
            If ctl.ControlType = acTextBox and ctl.Visible = False Then
            ctl.Value = Null
        Next ctl
    End If

对于复选框之类的控件类型将是 acCheckBox 并且值将设置为 0。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多