Jeff拥有完善的Excel工作簿,该工作簿使用VBA生成许多PDF格式的报告。它可以在多台PC上的Excel 2013 32位上很好地运行。相反,在运行Office 365的其他多台PC上,输出的中途Jeff收到“内存不足”错误。

因此,宏可以在旧版本的Excel上完美运行,但不能在最新版本上运行。 (再次,Jeff在多台PC上对此进行了测试,因此结果是可重复的。)Jeff想知道Office 365中是否存在已知的内存泄漏或宏差异可能会导致此问题。

通常,内存使用与一个主要问题有关—变量及其在宏中的使用方式。它特别适用于变量数组。确保声明所有变量(使用Option Explicit指令对此有所帮助)并检查数组尺寸以确保您没有试图声明一个疯狂的大数组总是一个好主意。

对象变量也可以使用大量内存。如果使用Set关键字将对象分配给变量,请确保完成后将对象变量设置为Nothing。这在循环内部尤为重要-如果每次循环均导致另一个对象变量的声明,如果您在循环的每次迭代过程中都无法清除该变量,则可以很快耗尽内存。

还有一点需要注意的是,当宏进行旋转时,关闭屏幕更新。如果您的宏试图不断更新屏幕,则会占用资源并减慢宏的速度。

有人会认为,在Jeff的情况下,内存使用并不是一个大问题。毕竟,他正在从32位版本的Excel迁移到(很有可能)64位版本。这使Excel可以比以前利用更大的内存空间。因此,人们会认为“内存不足”错误的可能性较小,而不是更大。

不幸的是,这里有一把扳手可以投入使用。当您收到“内存不足”错误时,可能不是内存是罪魁祸首。

多年来,Microsoft已记录在案,这种特殊的内存本质上是通用的,几乎可以由任何原因造成。 (在我的书中,该错误消息毫无用处,但我是谁来向Microsoft提出疑问。令人沮丧!)

我会考虑做的另一件事(没有看过Jeff的代码)是确保您没有线性编程。换句话说,将您的代码分解为单独的子例程,这些子例程执行小的离散任务。然后,您可以从主控制例程中调用每个子例程。这样做的好处是由于范围而导致的内存管理。

变量仅在使用它们的过程中具有作用域。

(好吧,除非您声明它们具有全局作用域,否则这是正确的,但这是另一回事。)这意味着在过程退出时,过程中使用的变量将被销毁并自动释放其内存。

但是,如果宏是线性编写的,因此没有子例程,那么在宏运行的整个过程中,所有变量都将保留在系统中。从内存管理的角度来看,最好将代码分解为过程,以便最大程度地减少内存使用量。

以这种方式模块化代码的另一个好处是,如果您遇到错误,即使是通常毫无价值的“内存不足”

错误-它很可能会在特定的过程中发生,因此您可以更好地查明实际错误的发生位置。我认为,这种更有效地跟踪潜在故障点的能力是一个很大的好处。

如果仍然不能解决问题,我已经看到一些报告,当您保存工作簿时,它会强制VBA在内存空间上进行垃圾回收。因此,有人建议让您的宏每隔一段时间而不是仅仅在宏末尾保存工作簿。我不知道此报告的准确性如何,但是如果您已经在使用宏来保存工作簿,那么多保存而不是少保存将不会有什么坏处。

最后一件事应该提到。如果您现在正在使用Office 365商业高级版,则它包括SharePoint Online和Excel Web App。因此,这些版本将Excel文件的大小限制为10 MB。如果文件很大,则在Excel 2013下可能效果很好,但由于此文件大小限制,在Office 365商业高级版下失败。

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

本提示(13619)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。