【问题标题】:Runtime error 3000 and Reserved Error (-3087) Access 2010 macro/VBA运行时错误 3000 和保留错误 (-3087) Access 2010 宏/VBA
【发布时间】:2017-04-06 17:30:07
【问题描述】:

使用 Access 2010,我有一个表格的条目单元格,它跨越 5 个单独的表单,并且我在每个表单上创建了命令按钮以在它们之间导航,过滤下一个表单以获取当前表单上的 ID。五个命令按钮中有四个可以很好地过滤到正确的表单,但是与一个表单关联的命令按钮会反馈错误消息:

保留错误(-3087);没有针对此错误的消息。

我使用宏和 VBA 在表单之间导航,使用 OpenForm 和 Where 条件上的过滤器或 DoCmd.OpenForm。宏看起来像:

Open Form
     Form Name "MyForm"
     View Form
     Filter name
     Where condition =="[ID]=" & [ID]
     Data mode
     Window mode Normal
Close Window
     Object Type Form
     Object Name "CurrentForm"
     Save No

VBA 代码如下:

DoCmd.OpenForm _
  "MyForm" _
, acNormal, _
, "[ID] = " & [ID] _
, acFormEdit _
, acNormal

VBA 也反馈

运行时错误 3000。

Google 搜索和堆栈溢出搜索没有任何帮助。这个错误似乎是无缘无故出现的,因为命令按钮以前可以正常工作。链接到其他表单的所有其他命令按钮都可以正常工作。

我猜测问题源于目标表单,而不是宏或 VBA,但我似乎无法找出问题所在。我已经:

  • 在信任中心启用数据库
  • 尝试使用tempVar 过滤表单
  • 尝试使用OnLoad 事件打开一个空白表单

(所有这些都会导致相同的错误 3087)

【问题讨论】:

  • 这个谜题太多,无法做出有根据的猜测,所以我建议你把它分解成简单的东西。请确认您收到“DoCmd.OpenForm”错误?首先,我会手动打开该表单并确保它有效。打开你的 VBA 项目,在即时窗口粘贴以下内容并执行: DoCmd.OpenForm "MyForm", acNormal, , "[ID] = " & [ID], acFormEdit, acNormal 根据成功或失败,我们可以转到第 2 步。
  • 冒着将自己暴露为 VBA 菜鸟的风险,我这样做了,并收到“编译错误:未定义外部名称”。我能够从对象面板中拉出表单,并从与数据输入表单不同的导航表单访问它。但是,当我在 GUI 的主功能区中选择“切换过滤器”时,它也会出现 3087 错误。
  • 您是否将“MyForm”更改为您的表单名称?老鼠,对不起,我明白了……在这种情况下,您没有“[ID]”。只需删除过滤器,然后重试。
  • 我确实更改了即时窗口尝试的表单名称。我在没有过滤器的情况下尝试了立即窗口(OpenForm 应用的除外)。事实上,如果我从 OpenForm 命令中删除“Where”子句,该命令会提取表单的未过滤副本。至于过滤器,我正在尝试将其作为另一种解决方案,并希望将问题缩小到过滤问题。我想我之前的评论不够准确。除了从对象面板中拉出所需的表单并单击“切换过滤器”按钮之外,我什么也没做,它给了我 3087 错误。
  • 如果您能够从即时窗口以未过滤的形式打开,但如果您切换过滤器则会出错,我会:(1)在设计视图中打开并检查 Recordsource ...它是表还是查询?看起来好吗? (2) 检查 Filter 属性、FilterOn、Allow Filters 等,看看是否有什么不合适的地方。

标签: vba ms-access macros


【解决方案1】:

我不喜欢在尝试解决问题时创建“答案”,但觉得交流更多说明/想法更容易。我将根据解决问题删除或更新此答案。

请查看我的所有陈述并确认我正确地陈述了所做的事情。

背景:使用宏或 VBA DoCmd.OpenForm 从另一个表单打开一个表单会导致错误“运行时错误 3000 和保留错误 (-3087)”

你的正常 VBA 如下:

DoCmd.OpenForm "MyForm", acNormal, , "[ID] = " & [ID], acFormEdit, acNormal

您可以从即时窗口运行上述代码并删除“Where Condition”(ID = ID),然后表单将正常打开。由于 [ID] 不在即时窗口的范围内,因此您不能简单地运行带有“Where”条件的命令。

Open/Load/Resize/Activate/Current 事件中的表单中是否有任何代码?

这是我将如何进行调试:

  1. 克隆该表单,将其保存为“Form3000”。
  2. 进入代码窗口,选择所有代码并注释掉。
  3. 获取有效的“ID”进行测试。
  4. 在新模块中创建子程序如下:

    Option Compare Database
    Option Explicit
    
    Sub Test3000()
    Dim MyID    As Long
    
    On Error GoTo Error_Trap
    MyID = InputBox("Enter a valid ID", "Enter Where COndition")
    'DoCmd.OpenForm "Form3000", acNormal, , "[ID] = " & [ID], acFormEdit, acNormal
    DoCmd.OpenForm "Form3000", acNormal, , "[ID] = " & MyID, acFormEdit, acNormal
    Exit Sub
    
    Error_Trap:
        Debug.Print Err.Number & vbTab & Err.Description
        MsgBox Err.Number & vbTab & Err.Description
        Exit Sub
        Resume              ' If needed later...
        Resume Next
    End Sub
    
  5. 执行代码,输入有效ID。

  6. 会发生什么?
  7. 如果仍然失败,请发布 Recordsource、Filter 的表单属性
  8. 如果可行,请取消注释表单中的所有代码并将其发布到您的问题中。

根据发生的情况,我们可以尝试其他选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多