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

问题描述:

昨天我正在围绕SE和网络寻找一种方法,将来自多个记录的特定字段连接在一起,作为Access数据库中查询/报告结构的一部分。我发现this SE question这导致我转向了Allen Browne的ConcatRelated()函数 here。在通过命名该模块与功能相同来错误地走下去之后,我按照需要工作。为什么这个错误导致循环而不是退出函数?

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

我最终从错误处理程序中注释掉所有内容并将其告知Exit Function,最终摆脱了困境。我知道最有可能只是掩盖了问题,所以我添加了一个计数器,并在每次调用错误处理程序时增加计数器,然后在即时窗口中检查该值。果然,每次我在查询中的某处点击时,它会增加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多条记录的表格,但后来用一张只有10条记录的小表进行了实验。 小表查询SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistory重现错误。 表TestEmpHistory采用以下格式:
ID(AutoNum)| Employee | EmpGroup |查询中未引用的其他字段


ID | Employee | EmpGroup |

1 | Employee1 | G & A
2 | Employee1 |销售
3 | Employee2 | CSR
4 | Employee2 | G & A
5 | Employee3 | CSR
6 | Employee3 |编程
7 | Employee3 | G & A
8 | Employee4 | CSR
9 | Employee4 | CSR
10 | Employee4 |编程

我使用Access 2016

+3

我不认为有人会读你所有的问题,你可以总结它或添加一些代码? – Moreno

没有看完整个帖子,我猜你在一个循环是其原因是因为它的运行对查询返回的每一行的代码。解决这个问题的唯一方法是,当您闯入代码时暂时将其全部注释掉,以便查询可以完成而不会为每行产生错误。完成此操作后,您可以返回并更正您的查询设计,然后取消注释功能代码并再次尝试。

+0

在点击它之前,我不得不阅读它,但它很有意义。这是我第一次在查询中使用函数。该函数不会停留在循环中,而是调用基本上被阻塞的函数的查询。问题出在我寻找的地方。在我的疑难解答中丢弃了我的东西是,当查询中有600多行时,ErrorCount通常只返回33-35个错误。它只是这样做,因为这是屏幕上可见的行数!我缩小了行高度并增加了ErrorCount以匹配。 –

+0

Upvoted并标记为回答,虽然我没有代表upvote计数在这一点。 –