使用Option Explicit的MS Access VBA提供"未定义变量"错误,但在不同的数据库上工作

Kev*_*vin 6 ms-access vba

我正在将表单从一个Access数据库移动到另一个Access数据库.当我尝试编译新数据库时,它会给出"未定义变量"错误.仅在使用Option Explicit时才会发生这种情况.该变量是一种AccessField数据类型,由表单的SQL查询选择.这在我正在移动它的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
Run Code Online (Sandbox Code Playgroud)

并且该表单中的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
Run Code Online (Sandbox Code Playgroud)

And*_*dre 4

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

您链接线程中的这篇文章似乎有一个解释:

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

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

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

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

如果以上仍然无法编译,您可以使用Me!RecNbr.

有用的阅读:VBA 和 MS-Access 中的 Bang Notation 和 Dot Notation