不久前,我正在与一位同事交谈,他描述了在功能非常强大的计算机系统上运行宏时遇到的问题。

似乎宏总是会崩溃并冻结计算机,并且总是出现内存不足错误。我的同事认为,如果宏可以在后台运行,则不会使用太多资源,也不会崩溃。

我知道建议的解决方案不一定能解决问题。尽管它可能会释放一些资源,但系统最终仍会耗尽内存。为什么?因为内存不足问题通常是由于原始宏中的编码问题引起的。

宏代码中的许多问题都可能导致“内存泄漏”(导致内存不足)。

最好的解决方案是一轮深夜调试,逐步检查宏代码并分析问题的根源。首先寻找最明显(但容易忽略)的问题,例如无限循环。如果宏正在执行大量重复处理(遍历工作表),请确保释放了为宏声明的所有内存。例如,对于您使用的每个SET语句,都应该有一个相应的语句将对象设置为NOTHING,并且这些语句应该在循环内。

如果您可以在不使宏失败的情况下逐步执行宏,那么问题很有可能出在线程中的某种时序问题上—当然,只有当宏在全倾斜下运行时,时序问题才会出现它自己的。如果您怀疑这是问题所在,则可以对宏中的事件重新排序可以解决该问题。

如果宏使用DDE,则应注意,Microsoft建议使用OLE自动化而不是DDE。时序问题在DDE中相当普遍,Microsoft现在认为它已过时且过于脆弱,无法修复(这意味着他们将不支持它)。在VBA中,对子例程的多次调用也会导致内存泄漏,因此必须将这些子例程重写为用户定义的函数。

您还应确保所有变量引用均已完全声明。我已经看到一些关于宏在工作表之间“混淆”的报告,即使您使用Alt + Tab从Excel中删除焦点也是如此。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2579)适用于Microsoft Excel 97、2000、2002和2003。