为什么我的VBA程序有时会在调试模式下停止?

53 浏览
0 Comments

为什么我的VBA程序有时会在调试模式下停止?

在Access表单中,我有一个按钮单击事件,有时会以调试模式打开VBA编辑器,并将“On Error ...”行高亮显示。我可以按F5继续执行其余的过程,它可以正常工作。

它并不总是发生。 好像是随机的,除了似乎有一个模式,即在打开文件后第一次单击此按钮时发生。尽管并不总是这样。

您对此有什么想法或以前的经验,以发生同样的事情并找到解决方案?这可能是一种可怕的用户体验。

admin 更改状态以发布 2023年5月23日
0
0 Comments

首先,在运行任何代码之前(在启动过程中按住Shift键以防止任何代码运行)。

现在,Ctrl-G(跳转到VBA IDE)。现在从工具中选择debug->Clear all Breakpoints

像这样:

enter image description here

现在,打开任何代码模块--按Enter键使代码处于"dirty"状态。现在选择debug->Compile(第一个菜单选项)。它将显示"my app name"的编译。

确保代码能够编译。如果不能,那么就可能仍然存在一些杂散的断点。

接下来,需要检查/更改错误的默认行为。

仍处于VBA编辑器/IDE中

从菜单栏中选择tools->options。默认值为"BREAK ON UNHANDLED ERRORS"。

如果你选择了BREAK ON ALL ERRORS?那么即使是假设捕捉错误,或者哪怕是在错误恢复下错误的代码也会崩溃并停止。通常开发者会在集合中检查元素的存在,我们会在错误上停留以"含义"元素没有在那个列表中。但是,这就假定默认的错误捕捉设置没有变化。

因此,应该双重甚至三重检查此设置。你可以开发多年,甚至有些代码假定会出错,但是这些多年的发展代码假定的默认值(在未处理错误时折断)如果你挂断所有的错误,那么你就麻烦了,你会发现所有种类的代码都在破裂。(这个选项的理念是让你调试有错误处理的代码而无需禁用错误。并且如果在错误恢复下面,则无法调试代码的一部分。

现在,如果以上步骤无法解决你的问题?

那么下一步就是反编译你的应用程序。这将删除应用程序的编译(二进制)部分。一旦你这样做了,那么你就可以完全重新编译。

要进行反编,你不能从IDE中进行这个过程,你必须使用一个完全限定路径来访问你现有版本的access。就像这样:

"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE"
"c:\MyCoolApp\Invoice.accDB" /decompile

现在,当你运行以上命令时,你真的不能让任何启动表单或代码运行。(按住shift键).现在退出access/application。现在重新启动(并且再次没有任何代码可以运行)。

现在,在这个阶段,我强烈建议进行Comp + Repair(并且再次没有启动或代码运行)。因此,即使在C + R上,你仍然需要按住shift键。

如果在反编译过程中启动了应用程序,则C + R允许任何代码运行,那么您必须重新开始第一个反编译步骤。

好了,现在你完成了C + R。现在ctrl-g,现在debug-compile。

0