为什么这个错误会导致循环而不是退出函数?

Why is this error causing a loop instead of exiting the function?

我昨天在 SE 和网络上寻找一种方法,将来自多个记录的特定字段连接在一起,作为我的 Access 数据库中 query/report 结构的一部分。我找到了 this SE question which led me to Allen Browne's ConcatRelated() function here。通过将模块命名为与函数相同的名称而走错了路之后,我让它按预期工作了。

但是,在我最初尝试在查询中使用它时,我犯了一个愚蠢的错误,并向它提供了等同于 "WHERE Employee = " & [Employee] 的参数,而不是评估为字符串所需的正确 'WHERE Employee = ' & [Employee] & "'" .这导致了预期的 3464(数据类型不匹配)运行时错误,但经过 Allen 的修改,它显示了导致错误的实际字符串。毫不奇怪,我将单击“确定”并修复 SQL。我很惊讶地发现这不起作用。一旦我点击了消息框,它就会再次出现。我使用 Ctrl+Break 停止代码,但单击 End 导致它立即返回到相同的错误,而不是实际结束函数。我可以停止循环的唯一方法是单击 Debug,这会按预期将我放入代码中,但我无法退出代码以更改原始查询。点击重置导致错误再次弹出并让我回到循环中。

我最终通过注释错误处理程序中的所有内容并将其告诉 Exit Function 摆脱了它。我知道这很可能只是掩盖了问题,所以我添加了一个计数器并让它在每次调用错误处理程序时递增,然后检查即时 window 中的值。果然,每次我点击查询中的某处,它都会增加 10 或更多。

我不明白是什么导致错误循环。 Err_Handler 应该在第一个错误时将它从函数中转储出来,因为没有什么告诉它尝试 Resume 并且它专门将它定向到 Exit_Handler 重置几个变量然后 Exit Function。即使直接将 Exit Function 放入 Err_Handler 中,仍然会导致我的错误计数器多次递增。进一步试验 Debug 突出显示行 Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)。我不知道它有多大帮助,因为它是函数构造 strSql 值后的第一行。将其注释掉会导致下一行突出显示。

我知道为什么会导致初始错误(我的错误),这很容易解决。我对错误的意外结果及其创建的循环更感兴趣。

tl;博士

  1. 什么会导致此错误循环而不是退出或中断?
  2. 如果错误处理调用立即退出但添加诸如 msgbox 之类的东西似乎会无限循环,或者至少直到我厌倦了点击,为什么它似乎会出现有限的次数。
  3. 有没有办法在代码中规避这个问题,以便它在第一个错误后真正停止?

我最初使用的是具有 600 多条记录的 table,但后来使用只有 10 条记录的小型 table 进行了进一步试验。 小 Table 查询 SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistory 重现错误。 table TestEmpHistory 的格式如下:
ID(自动编号)|员工|员工组|查询中未引用的其他字段


ID|员工|企业集团|

1 |员工 1|一般事务
2 |员工1|销售额
3 |员工2|企业社会责任
4 |员工2|一般事务
5 |员工3|企业社会责任
6 |员工 3|编程
7 |员工3|一般事务
8 |员工4|企业社会责任
9 |员工4|企业社会责任
10|员工4|编程

我使用的是 Access 2016

没有阅读整个 post,我猜你陷入循环的原因是因为它是 运行 查询返回的每一行的代码。摆脱这种情况的唯一方法是,当您进入代码时,暂时将其全部注释掉,以便查询可以完成而不会为每一行生成错误。完成后,您可以返回并在 un-commenting 函数代码之前更正您的查询设计,然后重试。