Excel VBA 程序仅以 25% 的速度运行

Excel VBA 程序仅以 25% 的速度运行

我的四核 Acer Aspire S3 Ultrabook 上运行着一个 VBA 程序。问题是,它只使用了 25% 的 CPU(其他进程合计使用了约 1%)。笔记本电脑运行的是 Windows 8.0。Excel 版本是 2013(32 位)。只使用了 55% 的系统 RAM,而 Excel 只使用了 55% 中的一半。

我认为可能只使用了 25%,因为 Excel 只使用了一个核心。但是,我没有任何证据支持这一理论。我该如何加快程序速度?

谢谢。

答案1

听起来你尝试使用的程序是单线程的,这意味着它只能使用一个核心,它不知道其他核心的存在。除了购买单核时钟速度更快的处理器或使用支持多线程的程序外,确实没有具体的方法来加快速度。

答案2

以下所有内容适用于 Excel 2007 及更早版本。根据关联@Ƭᴇcʜιᴇ007 在上面的评论中说,Excel 2013 本身对多线程提供了支持。话虽如此,除非您是一位经验丰富的程序员,否则还是应该警告您别再使用它。

不幸的是,VBA 不支持多线程,因此您的 VBA 计算将仅限于处理器的一个核心。

但是,有一种高级方法可以诱使 VBA 运行多个线程,即生成 VBscript 文件并同时执行它们。这种方法通过在 Excel 进程之外运行代码来解决这个问题,并允许 Windows 管理分配给不同线程的资源。

话虽如此,要实现这一点很可能意味着要完全重新考虑代码的逻辑(即,您必须弄清楚如何以一种合理的方式分配任务,使它们能够同时运行),这对于您的项目来说可能是不可行的。我自己从未实现过这一点,所以我不能真正帮助您,只能告诉您我已经告诉过您的内容。

如果你想进入兔子洞,这里有一个有趣的博客文章这显示了一个完成此操作的示例。请注意:除非您是一位经验丰富的程序员,否则您最好忘记这个想法,而只接受 VBA 在单线程中运行。

Stack Overflow 上为勇敢者提供的其他资源:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668

当然,还有其他方法可以优化您的 VBA 代码,而无需使用多个线程。如果没有看到您的代码,就不可能提出尖锐的建议,但以下是一些常见的方法:

  • 将工作表中的数据加载到数组中以加快处理速度。与工作表的交互是 VBA 执行的主要瓶颈,可以通过使用数组将其最小化。
  • 一个相关的问题是 Excel 在每次更改单元格后都会重新计算工作簿。可以通过设置 来避免这种情况Application.Calculation = xlManual。只需确保Application.Calculation = xlAutomatic在退出 Sub 之前将其重新设置为 即可。

答案3

就像其他人说的,VBA 本身不是多线程的。如果你想加快速度,你可能要考虑用另一种语言编写用户定义函数 (UDF)。

我推荐您使用 ExcelDNA 和 C# 或 VB.Net。如果您已经知道如何编写一些 C# 并且可以在 UDF 中控制多线程,那么它们非常容易使用。

http://exceldna.codeplex.com/

答案4

就像上面其他人所说的那样,线程化可能是答案,但这实际上不是一个可行的解决方案,升级到 64 位也没有什么区别。您可以尝试做的一件事是提高进程的优先级,您可以看看如何做到这一点这里

很难说这是否会使您的脚本更快,因为程序的其他部分可能还存在另一个瓶颈(例如,从磁盘读取/写入),但它至少会让 Windows 知道它比您的其他进程具有更高的优先级。

相关内容