【发布时间】:2016-04-28 00:25:24
【问题描述】:
我在网络上有一个工作簿,其中包含工作表数据并包含大量数据、VBA 代码、表单等。我开发了一个自定义功能区,可通过加载项打开此文件并在按钮打开时执行宏单击功能区。
- 单击功能区按钮时,它会在包含自定义功能区 XML 文件的加载项内执行回调。
- 回调中的代码使用 Application.Run() 打开和执行更大的网络文件,该文件包含长时间自动化过程所需的工作表数据和宏。
- 如果用户通过多个表单之一上的“取消”按钮取消操作(或者如果代码成功完成执行),则通过 Application.Run 它将代码执行传递回包含自定义功能区的加载项中的另一个过程。
- 插件中的这个“EndProcedures()”宏关闭网络文件。
我遇到的问题是,一旦我关闭包含绝大多数 VBA 代码的网络文件,代码执行就会停止(就像遇到“结束”命令一样)。由于用户可以在宏的中间取消操作,因此对功能区工作簿(代码执行开始的那个)中“EndProcedures()”宏的过程调用类似于调用堆栈中的#8, #2-7 是驻留在由 #8 关闭的工作簿中的程序。由于我想停止代码执行,并且“EndProcedures()”宏中的下一行只是全局“End”命令,所以这不一定是问题。然而,在过去的几天里,我一直在努力解决一些神秘的错误,我认为这些错误可能与我正在关闭一个工作簿的事实有关,而它的代码在调用堆栈中运行。我在 VBA 编辑器中遇到“内存不足”错误(奇怪的是,当 VBA 编辑器未打开时我没有看到它们),我的想法是这是由于:
- 网络文件的代码窗口只是在文件本身被其他 VBA 代码关闭后在 VBA 编辑器中打开,或者
- 可能是由于文件已卸载而未清除对象引用造成的实际内存问题,而不是遇到“End Sub”或“End”行。
虽然我在网络文件中的宏中广泛使用自定义对象,但我对它们的内存使用非常小心(甚至不应该那么多)并且不认为这段代码是“内存不足”错误。现在的问题是,在关闭工作簿中运行代码时是否关闭带有 VBA 代码的工作簿会导致“内存不足”错误,如果是这样,可以采取什么措施,以便一旦宏执行结束,用户就没有我的宏工作簿打开来造成严重破坏。我真的必须在调用堆栈之外编写正确的“退出子”行吗?
这是我在 StackOverflow 上的第一篇文章,尽管我可能从这里学到了我在 VBA 中可以做的 50%,所以请多多包涵。
【问题讨论】:
-
VBA 对象会随着托管它们的应用程序而死亡,除非您使用的是非托管资源。时期。您可以泄漏的是应用程序实例,尤其是当您在另一台服务器上启动实例时。那将是我开始寻找的第一个地方。
-
@Comintern 我只运行了一个 Excel 实例,只打开了多个工作簿(顺便说一下使用 2010)。不要认为这是问题所在,但感谢您的意见。