限制Excel CPU使用率


31

有没有办法限制excel在运行时可以访问的CPU使用量?我有一个VBA脚本,可以计算一堆巨型数组公式。使用100%的CPU,整个计算可能需要20分钟,但我不能在此期间使用我的机器,而是希望它在后台以50%的CPU使用率运行,因此我可以继续做其他事情。有什么建议?

我的操作系统是Windows 7 Enterprise 64位,Excel版本是2007-32位


1
视窗?哪个版本?
DavidPostill

Windows 7.我将它添加到帖子中
learningAsIGo

8
获得多核CPU?如果你已经有一个(谁没有?)并且Excel正在使用所有核心(我不知道Excel可以做什么),那么在任务管理器中设置它的亲和力。
user20574

2
这不回答问题,但请确保在开始计算和更新数千个单元格之前关闭窗口更新。如果您有任何图表,请关闭它们。 VBA很慢,但是当它的时候 那么它通常是一个或两个都要归咎于它们。
Coxy

1
@cat:不,Windows任务管理器中100%的CPU使用率意味着所有逻辑处理器的100%。如果仅填充一个核心将是25%(在具有超线程的普通双核心上)或~36%(涡轮增压)。
Martheen Cahya Paulo

Answers:


54

如果从多个公式调用VBA函数或者如果您的脚本生成或强制重新计算多个公式,那么这绝对应该使用 多线程计算 Excel的功能。这将分别为每个公式运行VBA函数的多个实例,或者在vba脚本在单个线程上运行时同时重新计算多个单元格。

您可以限制Excel用于在Excel选项...高级选项卡...公式部分中重新计算公式的线程数。

enter image description here


VBA sub不是问题,它是VBA代码生成的excel数组公式。
learningAsIGo

@learningAsIGo对,我简化了我的回答。让我们知道将线程数设置为1是否有帮助。
mtone

1
这似乎已经成功了。我把它设置为3个内核,最高可达75%的CPU,让我有足够的空间做其他事情。谢谢!
learningAsIGo

27

请尝试更改任务管理器中的关联,而不是降低优先级。如果您有超过1个CPU,则可以限制Excel将使用的CPU数量。这将释放其他CPU来处理其他事情。

在“进程”选项卡中右键单击Excel,然后选择“设置关联性”。选择要运行Excel的CPU。


3
请注意,对于affinity,Windows也会将每个核心视为CPU。 (所以如果你有双核或四核,这将有用。)
jpmc26

1
好吧,如果专门讨论核心,为什么不HyperThreading线程呢?它们也是不同的逻辑CPU。即具有HT的四核CPU将具有8个逻辑CPU。
Ruslan

我在运行HandBrake时一直这样做,只想浏览互联网一小时而不停顿或停止转码过程。我认为值得一提的是,经过一段时间后,核心会被释放回程序并且关联性“重置”,至少在手刹时发生了这种情况。
MonkeyZeus

2
@MonkeyZeus通常,进程退出时不会保存关联。它仅适用于当前运行的进程。可能是HandBrake本身就产生了新的流程,或者你开始了新的流程。
jpmc26

@ jpmc26很高兴知道!我自己肯定没有开始新的过程,所以它必须自己产生它。
MonkeyZeus

7

您可以尝试通过查找打开任务管理器,切换到“详细信息”或“进程”选项卡(取决于您的Windows版本),右键单击excel.exe进程并选择一个来降低Excel进程的优先级。优先级较低。这应该为其他进程提供更多的CPU时间。


1
似乎不起作用:我将优先级设置得非常低,它仍然落后于计算机。
learningAsIGo

1
也许尝试提高您的网络浏览器的优先级,或同时尝试做的任何事情?我发现 关于如何有效改变优先事项的讨论
Slithy Toves

3
@SlithyToves:这真的不重要。如果有多个候选者,则优先级确定哪个程序获得CPU。将Excel设置为非常低意味着它只在完成所有其他程序时获得CPU切片。但是,当Excel 得到一个CPU切片,它不会放弃那个切片。它将失去下一个CPU时间片的竞争。
MSalters

3

VBA或声明中提供睡眠和等待功能。然而,“过于简单的经验法则”是永远不要使用Sleep()。 (google'“从不使用sleep()”编程')

Application.Wait的Doc页面( https://msdn.microsoft.com/en-us/library/office/ff822851.aspx )。请注意,睡眠和等待将导致Excel在您指定的持续时间内无响应,这可能会导致时间片“火车残骸”。

如果你的计算涉及某种循环,那么为你的特定目的处理这个问题的一种方法(CPU可用性的计算时间)是你自己的特殊等待函数,例如循环DoEvents()1秒钟和然后回来。

DoEvents基本上告诉您的代码/解释器放弃操作系统等的时间。这肯定会导致您的代码需要更长的时间。它还可以允许您在计算过程中编辑工作表,因此您的milage可能会有所不同。测试。

例如,见 https://stackoverflow.com/questions/469347/is-there-an-equivalent-to-thread-sleep-in-vba



0

当我的笔记本电脑有4GB的内存时,我遇到了同样的问题。一旦我升级到16GB,问题就停止了。另一种可能的解决方案


0

在宏的开头附近的某处添加以下2行:

'Turn off screen updating

 Application.ScreenUpdating = False

这两条线接近尾声:

'Turn screen updating back on

 Application.ScreenUpdating = True

然后,当你做其他事情时,它将会做更少的工作。



-5

使用OpenOffice或LibreOffice:它的脚本功能比MS更有效,你可以在计算中实现“节流”。

编辑:为什么downvote?看看 手册 并亲眼看看。您可以将计算转换为Java 正好 例如,具有JVM的所有限制功能。


3
我没有投票,但我认为这是因为你提出了一个解决方法而不是OP中提出的直接问题的解决方案:“有没有办法限制excel在运行时可以访问的CPU使用量? “
Monkpit

@Monkpit我的OpenOffice故事是从一个类似的问题开始的,我们所有文档的移植花了大约一个星期,但之后我发表了意见,我再也不会使用MS Office了。
Alexey Vesnin

OpenOffice远远优于Office,因为99%的人会使用Office over Libre,因此开发人员(可能就像这个人)。这就是我投票的原因。
Thomas Shera

@ThomasShera嗯,我根本无法理解 - 为什么 这么长时间以来,微软的家伙们都做不到 只是解决问题 ?不,不需要新东西,没有插件 - 只是让你的产品真正起作用......
Alexey Vesnin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.