使用 Option Explicit 的 MS Access VBA 给出“变量未定义”错误,但适用于不同的数据库

Posted

技术标签:

【中文标题】使用 Option Explicit 的 MS Access VBA 给出“变量未定义”错误,但适用于不同的数据库【英文标题】:MS Access VBA using Option Explicit gives "Variable not defined" error but works on a different database 【发布时间】:2018-09-15 04:46:57 【问题描述】:

我正在将表单从一个 Access 数据库转移到另一个。当我尝试编译新数据库时,它给出了“未定义变量”错误。这仅在使用 Option Explicit 时发生。该变量是表单的 SQL 查询选择的 AccessField 数据类型。这在我从中移动它的 Access 数据库上编译得很好,所以我完全迷失了试图找出问题所在?

我似乎遇到了这个旧线程中从未解决过的完全相同的问题:https://bytes.com/topic/access/answers/896346-variable-not-defined-error-field-exists

不止一个实例。任何引用未声明为变量的 AccessField 的内容都会在使用 Option Explicit 时返回该错误。

例如,表单正在使用查询:

Select * from BM where ClientID =143 and Month(BMDate) = 4 and year(bmdate) =2018 order by bmdate

并且该表单内的 VBA 代码将在此处失败并出现该错误:

Option Explicit
Option Compare Database

Private Sub Form_Load()
    If IsNull(RecNbr) Then
        'Code fails with RecNbr on line above when I try to compile
        'RecNbr is a field selected from the query and is not declared as a variable
    End If
End Sub

【问题讨论】:

你能在VBA 代码中发布错误行吗? - 和查询。 更新了问题。谢谢 【参考方案1】:

这可能有效,也可能无效,但评论太长了。

This post 在您的链接线程中似乎有一个解释:

在表单设计视图中,字段列表和控件源的下拉列表反映了当前的表设计;但 VBA 似乎有表单记录源架构的陈旧副本。

尝试重新同步记录源的 VBA 缓存 (?):

在表单设计中,删除记录源(如有必要,将其保存在文本编辑器中) 保存并关闭表单 也许可以压缩并修复数据库(我不知道这是否会改变行为) 在设计视图中重新打开表单 设置记录源。请注意,在点击 Return 后,Access 会花一点时间,然后绑定控件的警告三角形就会消失。 查看代码现在是否可以编译。

作为说明,我发现在引用表单控件或字段(而不是 VBA 变量)时,使用 Me.RecNbr 而不是 RecNbr 时代码可读性更好。

如果上面还是不能编译,可以使用Me!RecNbr

有用的阅读:Bang Notation and Dot Notation in VBA and MS-Access

【讨论】:

优秀。前段时间我有一个类似的问题,将一个表单复制到一个新的数据库,但不记得我是如何解决它的......@Kevin Access 会根据其数据源为表单生成一组属性。如果您使用代码动态更改数据源,则其中一些属性可能会变得无效。因此,动态更改表单数据源的代码可能会导致失败。我建议您使用“砰”表示法(me!SomeColumn),而不是“点”表示法,它可以而且会在没有通知的情况下失败(me.SomeColumn)。 Access 为您生成字段/列的集合。删除 + 重新输入数据源会强制访问重新生成该集合。不要依赖这种重新生成,因为它不会在运行时发生。

以上是关于使用 Option Explicit 的 MS Access VBA 给出“变量未定义”错误,但适用于不同的数据库的主要内容,如果未能解决你的问题,请参考以下文章

C++中的explicit关键字的用法

C++ explicit关键字详解

C++关键字之:explicit

explicit关键字

C++:explicit 关键字

C++ explicit关键字