在大型 VBA/MS Access 项目中查找语法错误

Posted

技术标签:

【中文标题】在大型 VBA/MS Access 项目中查找语法错误【英文标题】:Finding a syntax error in a large VBA/MS Access project 【发布时间】:2018-06-01 20:02:12 【问题描述】:

我有一个 MS Access 数据库,它在启动时显示有关 SQL 语法错误的错误消息。 “查询语法错误。查询子句不完整。”在我点击第一个“确定”几秒钟后,它还会显示另一个错误。

这是两个错误:https://imgur.com/a/PesjIFk

但它并没有告诉我语法错误在哪里。在这个项目的很多不同的地方都有 SQL 语句。这是一个非常大的项目,仅查看所有代码希望我在某个地方发现错误是不切实际的。我怎样才能找出这个错误在哪里?

编辑:好的,显然你必须有一个带有“Break”键的键盘才能找到错误所在。哇。幸运的是,我碰巧有一个。如果我在看到错误消息时按break,这是 Access 将我带到的代码。此代码用于另一个表单的子表单。它突出显示第一行 (Private Sub Form_Current())。

Private Sub Form_Current()
    If NumEnums > 0 Then
        CurrentEnum = val(Nz(bit_value_edit.value)) 'Update CurrentEnum to the currently selected enum
        Call UpdateEnumsLabel(Me.Parent![enums label]) 'Update label
    End If
End Sub

...这里是 UpdateEnumsLabel():

Public Sub UpdateEnumsLabel(ByRef label As Control)
    If NumEnums > 0 Then
        label.Caption = "Enums: " & CurrentEnum & "/" & NumEnums
    Else
        label.Caption = "Enums: 0"
    End If
End Sub

CurrentEnum 的定义:

Public CurrentEnum, CurrentPort, CurrentFile, CurrentGroup As Long

我认为此错误与 Form_Current() 中的代码无关,但 Access 突出显示了该行,因为该错误发生在打开表单时。但是该表单不包含任何使用查询的内容,所以我对 Access 的哪些查询有问题感到困惑。

【问题讨论】:

究竟是哪一行被突出显示? CurrentENum 也是一个功能吗? UpdateEnumsLabels 函数有什么作用? @DougCoats 我在问题中添加了该信息。 检查命名查询和/或SELECT 语句,它们用作表单的记录源或组合框或列表框的行源。如果表单包含子表单,请在那里重复这些检查。请向我们展示错误消息的全文。 @HansUp 我查看了表单的所有记录源/行源,但没有一个使用任何 SQL。该表单仅包含稍后将使用的标签和文本框。 请添加错误消息的屏幕截图(只需将 imgur.com 链接添加到您的问题)。 【参考方案1】:

当错误消息弹出时,使用 Control+Break。它将带您到导致问题的线路。

您还应该打开一个模块并在 VBA 编辑器中形成调试选项,选择“编译所有模块”

而且由于它似乎发生在打开/加载时,您可以检查宏和主模块以查找在 AutoExec 上触发的任何内容。

【讨论】:

这会将我带到一些没有任何错误的代码。它编译得很好。它带我去的代码附近也没有 SQL 语句,所以这不可能是正确的位置。我希望 Access 能告诉我问题出在哪个文件和行... @DanielCourtney-Gregerson 你也需要什么代码?这将帮助我帮助您解决更多问题 我将代码添加到问题中,因为它无法正确格式化为注释。【参考方案2】:

通常 ctrl-break 会命中你出错的那一行。然而,在多个“事件”的情况下,代码没有错误处理,那么错误通常发生在调用代码的例程中,而不是导致错误的实际代码。

我会做什么来启动应用程序(按住 shift 键以防止任何启动代码或表单运行)。

现在您启动了应用程序,但没有运行表单或代码,然后检查 autoexecc 宏(如果有,检查它尝试运行的代码)。

如果没有使用自动执行宏,则在文件->选项->当前数据库下检查。在此视图中,您可以查看/查看/确定启动表单的名称。

一旦确定了从 autoexec 宏调用的启动表单(或启动模块/代码),您就可以简单地添加一个空白代码模块,并在代码中放置用于启动应用程序的 SAME 命令。

所以我们假设没有 autoexec 宏,并且你确定启动窗体是 frmMain。

所以现在,我们可以启动应用程序(按住 shift 键以防止任何启动代码运行)。现在,在新的“测试”标准代码模块中输入以下代码:

Sub MyGo

  Stop

  Docmd.OpenForm "frmMain"

End sub

所以你输入上面的代码,按 ctrl-s 保存上面的代码。现在将光标放在上述代码中的任意位置,只需按 F5 即可运行。

此时您在调试器中点击/停止“停止”命令。此时,您可以按 f8 进入下一行代码。如果有问题的表单调用其他代码等,您仍然可以单步执行,并且“最终”您点击了导致错误的行。

虽然应用程序可能很大,但简单查看启动表单(然后是启动代码)意味着您只需要跟踪和查看启动代码 - 而不是整个应用程序。

【讨论】:

以上是关于在大型 VBA/MS Access 项目中查找语法错误的主要内容,如果未能解决你的问题,请参考以下文章

VBA (Ms-Access) 从宏调用成员函数

填充集合VBA MS Access - 参考问题

有没有办法在 VBA(MS Access 2002 或 2003)中调用任何控件的更新前事件过程?

使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表

VBA MS 项目将多个自定义报告以 PDF 格式保存到位置

一种在大型 Xcode 项目中查找孤立图像的方法