【问题标题】:What happens when you close a workbook with code running?当您关闭运行代码的工作簿时会发生什么?
【发布时间】:2016-04-28 00:25:24
【问题描述】:

我在网络上有一个工作簿,其中包含工作表数据并包含大量数据、VBA 代码、表单等。我开发了一个自定义功能区,可通过加载项打开此文件并在按钮打开时执行宏单击功能区。

  1. 单击功能区按钮时,它会在包含自定义功能区 XML 文件的加载项内执行回调。
  2. 回调中的代码使用 Application.Run() 打开和执行更大的网络文件,该文件包含长时间自动化过程所需的工作表数据和宏。
  3. 如果用户通过多个表单之一上的“取消”按钮取消操作(或者如果代码成功完成执行),则通过 Application.Run 它将代码执行传递回包含自定义功能区的加载项中的另一个过程。
  4. 插件中的这个“EndProcedures()”宏关闭网络文件。

我遇到的问题是,一旦我关闭包含绝大多数 VBA 代码的网络文件,代码执行就会停止(就像遇到“结束”命令一样)。由于用户可以在宏的中间取消操作,因此对功能区工作簿(代码执行开始的那个)中“EndProcedures()”宏的过程调用类似于调用堆栈中的#8, #2-7 是驻留在由 #8 关闭的工作簿中的程序。由于我想停止代码执行,并且“EndProcedures()”宏中的下一行只是全局“End”命令,所以这不一定是问题。然而,在过去的几天里,我一直在努力解决一些神秘的错误,我认为这些错误可能与我正在关闭一个工作簿的事实有关,而它的代码在调用堆栈中运行。我在 VBA 编辑器中遇到“内存不足”错误(奇怪的是,当 VBA 编辑器未打开时我没有看到它们),我的想法是这是由于:

  1. 网络文件的代码窗口只是在文件本身被其他 VBA 代码关闭后在 VBA 编辑器中打开,或者
  2. 可能是由于文件已卸载而未清除对象引用造成的实际内存问题,而不是遇到“End Sub”或“End”行。

虽然我在网络文件中的宏中广泛使用自定义对象,但我对它们的内存使用非常小心(甚至不应该那么多)并且不认为这段代码是“内存不足”错误。现在的问题是,在关闭工作簿中运行代码时是否关闭带有 VBA 代码的工作簿会导致“内存不足”错误,如果是这样,可以采取什么措施,以便一旦宏执行结束,用户就没有我的宏工作簿打开来造成严重破坏。我真的必须在调用堆栈之外编写正确的“退出子”行吗?

这是我在 StackOverflow 上的第一篇文章,尽管我可能从这里学到了我在 VBA 中可以做的 50%,所以请多多包涵。

【问题讨论】:

  • VBA 对象会随着托管它们的应用程序而死亡,除非您使用的是非托管资源。时期。您可以泄漏的是应用程序实例,尤其是当您在另一台服务器上启动实例时。那将是我开始寻找的第一个地方。
  • @Comintern 我只运行了一个 Excel 实例,只打开了多个工作簿(顺便说一下使用 2010)。不要认为这是问题所在,但感谢您的意见。

标签: excel vba


【解决方案1】:

在继续玩这个几周后,在涉及多个工作簿/模块的调用堆栈中间退出代码执行似乎不是遇到的“内存不足”问题的根源。虽然我无法确定哪些编辑实际上解决了“内存不足”错误,但至少问题已经得到了满意的解决。

附: - 我回答了我自己的问题,因为它不再是一个问题,而不是因为我必须确定一个解决方案。由于这是我在 StackOverflow 上的第一篇文章,如果这不是正确的操作,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多