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

时间:2017-02-16 20:17:01

标签: vba access-vba runtime-error ms-access-2016

我昨天在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; dr

  1. 什么会导致此错误循环而不是退出或中断?
  2. 如果错误处理立即退出,为什么它似乎会发生有限次数但是首先添加类似msgbox的东西似乎无限循环,或者至少在我厌倦了点击之前。
  3. 有没有办法在代码中绕过这个,以便它在第一次错误后实际停止?
  4. 我最初使用的是一张包含600多条记录的表,但后来又用一张只有10条记录的小表进行了实验。 小表查询SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistory以重现错误。 表格TestEmpHistory采用以下格式:
    ID(AUTONUM)|员工| EmpGroup |查询中未引用的其他字段

    ID |员工| EmpGroup |

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

    我正在使用Access 2016

1 个答案:

答案 0 :(得分:1)

在没有阅读整篇文章的情况下,我猜测你在循环中的原因是因为它为查询返回的每一行运行此代码。摆脱这种情况的唯一方法是,当您闯入代码时,暂时将其全部注释掉,以便查询可以完成而不会为每一行生成错误。完成此操作后,您可以在取消注释功能代码并再次尝试之前返回并更正查询设计。