转到下一个记录代码无故激活?

Go to next record code activating for no reason?

微软访问 2016

我在一个表单的当前事件中有如下代码:

Dim linecount As Integer
Dim linenum As Integer

Private Sub Form_Current()

linenum = (DCount("ID", "tbl ShippingHistory", "[sales order] = forms![frm Shipping Information]!combo3") - 1)

If linecount < linenum Then
    linecount = linecount + 1
    DoCmd.GoToRecord Record:=acNext
End If

End Sub

嗯,实际上还有很多,但这是给我带来麻烦的部分。如果我注释掉整个子部分,这部分仍然会导致问题。

所以当表格打开时,基本上它会计算订单的行数并将其存储在 linenum 中(然后减去一个,因为我不想包括我开始的记录)

然后每次我们浏览当前事件时,它都会将 linecount 加 1 并转到下一条记录。

当 linecount 等于 linenum 时,我们应该在最后一条记录上,我们不想再转到下一条记录。

所有这一切似乎工作正常,直到我们到达最后一条记录,此时出现错误:运行-时间错误 2105:您无法转到指定的记录。当我点击调试按钮时,Access 指示错误出在 DoCmd.GoToRecord Record:=acNext

所以我在 If 语句的开头打了一个断点,然后逐步执行它,结果如下:

  1. 它按我预期的那样工作,它计算行数,每次我们转到新记录并激活当前事件时它加 1,当 linecount 最终等于 linenum 时,它跳过其余部分if 语句并转到 end sub 但事件并没有就此结束...

  2. 然后...当我按 F8 进行下一步时,它跳回到 End If 完全跳过其他所有内容,然后下一个 F8 将它带到 end sub 再次弹出错误。说我不能去记录...

现在我很困惑,因为转到下一条记录似乎没有再次激活,那么为什么要尝试转到下一条记录?更重要的是,为什么它不结束子并在它最终达到 end sub 时停止,而是返回到 end if...?

编辑:只是额外的信息,我确实尝试粘贴

else
     Exit Sub

到 if 语句,但没有什么不同。

大家早上好,

在@Javier 提出一些测试我的问题的建议后,我找到了我的解决方案。

所以我最终做了什么,而不是试图阻止当前事件触发额外的时间,这看起来很麻烦,我只是改变了事件。我拿了我之前展示的代码:

Dim linecount As Integer
Dim linenum As Integer

Private Sub Form_Current()

linenum = (DCount("ID", "tbl ShippingHistory", "[sales order] = forms![frm Shipping Information]!combo3") - 1)

If linecount < linenum Then
    linecount = linecount + 1
    DoCmd.GoToRecord Record:=acNext
End If

End Sub

并将其放入按钮点击事件中。

所以现在事件只有在我点击每条记录上的按钮时才会触发。

在验证工作正常后,如果我们不在最后一条记录 (linecount < linenum),我添加了一行调用按钮的点击事件。当这也起作用时(按下第一条记录上的按钮会按我想要的方式浏览所有记录)。我添加了 else docmd.close 这样当我们完成最后一条记录时它会关闭表单

Dim linecount As Integer
Dim linenum As Integer

Private Sub btn_DoNextRecord_Click()

linenum = (DCount("ID", "tbl ShippingHistory", "[sales order] = forms![frm Shipping Information]!combo3") - 1)

If linecount < linenum Then
    linecount = linecount + 1
    DoCmd.GoToRecord Record:=acNext
    **Call btn_DoNextRecord_Click**
Else
    DoCmd.Close
End If

End Sub

最后,为了使整个过程自动化,我将 Call btn_DoNextRecord_Click 添加到表单加载事件中,以便打开表单时会第一次按下按钮,运行 通过所有记录然后关闭表格。现在一切似乎 运行 正确。

再次感谢@Javier 让我走上正轨并告诉我如何验证问题!