Begrenzen Sie die Excel-CPU-Auslastung

31

Gibt es eine Möglichkeit, die CPU-Auslastung einzuschränken, auf die Excel während der Ausführung zugreifen kann? Ich habe ein VBA-Skript, das eine Reihe von Riesen-Array-Formeln berechnet. Die gesamte Berechnung dauert unter Verwendung von 100% meiner CPU vielleicht 20 Minuten, aber ich kann meinen Computer während dieser Zeit nicht verwenden und möchte, dass er bei einer CPU-Auslastung von etwa 50% im Hintergrund ausgeführt wird, damit ich weiterhin andere Aufgaben ausführen kann. Irgendwelche Vorschläge?

Mein Betriebssystem ist Windows 7 Enterprise 64-Bit und die Excel-Version ist 2007-32-Bit

learningAsIGo
quelle
1
Windows? Welche Version?
DavidPostill
Windows 7. Ich werde fügen Sie es auf die Post
learningAsIGo
8
Holen Sie sich eine Multicore-CPU? Wenn Sie bereits einen haben (wer nicht?) Und Excel alle Kerne verwendet (was ich nicht wusste, dass Excel dies tun könnte), legen Sie die Affinität im Task-Manager fest.
user253751
2
Dies beantwortet die Frage nicht, aber stellen Sie sicher, dass Sie die Fensteraktualisierungen deaktivieren, bevor Sie mit der Berechnung und Aktualisierung von Tausenden von Zellen beginnen. Wenn Sie Diagramme haben, deaktivieren Sie diese ebenfalls. VBA ist langsam, aber wenn es wirklich langsam ist, dann sind normalerweise einer oder beide schuld.
Coxy
1
@cat: Nein, eine 100% ige CPU-Auslastung im Windows Task-Manager bedeutet 100% auf allen logischen Prozessoren. Wenn nur ein Kern gefüllt ist, beträgt er entweder 25% (bei einem herkömmlichen Dual-Core mit Hyper-Threading) oder ~ 36% (Turbo-Boosting).
Martheen Cahya Paulo

Antworten:

54

Wenn eine VBA-Funktion aus mehreren Formeln aufgerufen wird oder wenn Ihr Skript die Neuberechnung mehrerer Formeln generiert oder erzwingt, sollte dies auf jeden Fall die Multithread-Berechnungsfunktion von Excel nutzen. Dies würde entweder mehrere Instanzen Ihrer VBA-Funktion für jede Formel ausführen oder mehrere Zellen gleichzeitig neu berechnen, während Ihr VBA-Skript in einem einzelnen Thread ausgeführt wird.

Sie können die Anzahl der von Excel zum Neuberechnen von Formeln verwendeten Threads im Abschnitt Excel-Optionen ... Registerkarte Erweitert ... Formeln begrenzen.

Bildbeschreibung hier eingeben

mtone
quelle
Das VBA-Sub ist nicht das Problem, es ist die Excel-Array-Formel, die der VBA-Code generiert.
learningAsIGo
@learningAsIGo Richtig, ich habe meine Antwort vereinfacht. Lassen Sie uns wissen, ob es hilfreich ist, die Anzahl der Threads auf 1 zu setzen.
mtone
1
Dies scheint den Trick getan zu haben. Ich habe es auf 3 Kerne eingestellt und es ist bei 75% der CPU maximal, was mir viel Raum lässt, um andere Dinge zu tun. Vielen Dank!
learningAsIGo
27

Versuchen Sie, die Affinität im Task-Manager zu ändern, anstatt die Priorität zu verringern. Wenn Sie mehr als 1 CPU haben, können Sie die Anzahl der von Excel verwendeten CPUs begrenzen. Dies gibt den anderen CPUs die Möglichkeit, an anderen Dingen zu arbeiten.

Klicken Sie mit der rechten Maustaste auf der Registerkarte Prozesse auf Excel, und wählen Sie Affinität festlegen aus. Wählen Sie die CPUs, auf denen Excel ausgeführt werden soll.

B540Glenn
quelle
3
Beachten Sie, dass Windows aus Gründen der Affinität auch jeden Kern als CPU betrachtet. (Das würde also funktionieren, wenn Sie einen Dual- oder Quad-Core haben.)
jpmc26
1
Wenn Sie speziell über Kerne sprechen, warum dann nicht über HyperThreading-Threads? Sie sind auch unterschiedliche logische CPUs. Dh eine Quad-Core-CPU mit HT hat 8 logische CPUs.
Ruslan
Ich mache dies die ganze Zeit, wenn HandBrake ausgeführt wird, und möchte nur eine Stunde lang im Internet surfen, ohne den Transcodierungsprozess anzuhalten oder anzuhalten. Ich denke, es wäre erwähnenswert, dass nach einiger Zeit die Kerne wieder in das Programm freigegeben werden und die Affinität "zurückgesetzt" wird, zumindest passiert es mir mit der Handbremse.
MonkeyZeus
2
@MonkeyZeus Normalerweise wird die Affinität beim Beenden eines Prozesses nicht gespeichert. Dies gilt nur für den aktuell ausgeführten Prozess. Es kann sein, dass HandBrake selbst neue Prozesse erzeugt hat oder dass Sie neue gestartet haben.
jpmc26
@ jpmc26 Gut zu wissen! Ich habe auf keinen Fall selbst einen neuen Prozess gestartet, also muss es sein, dass er von alleine auftaucht.
MonkeyZeus
7

Sie können versuchen, die Priorität des Excel-Prozesses zu verringern, indem Sie den Task-Manager öffnen, zur Registerkarte "Details" oder "Prozesse" wechseln (abhängig von Ihrer Windows-Version), mit der rechten Maustaste auf den Prozess "excel.exe" klicken und a auswählen geringere Priorität. Dies sollte anderen Prozessen mehr CPU-Zeit geben.

Slithy Toves
quelle
1
Scheint nicht zu funktionieren: Ich habe die Priorität auf sehr niedrig gesetzt und der Computer ist immer noch im Rückstand.
learningAsIGo
1
Versuchen Sie vielleicht, die Priorität Ihres Webbrowsers zu erhöhen, oder was auch immer Sie gleichzeitig tun möchten? Ich fand diese Diskussion darüber, wie effektiv es ist, Prioritäten zu ändern .
Slithy Toves
3
@SlithyToves: Das sollte eigentlich egal sein. Die Priorität bestimmt, welches Programm die CPU erhält, wenn es mehrere Kandidaten gibt. Wenn Sie Excel auf sehr niedrig einstellen, wird nur dann ein CPU-Slice erstellt, wenn alle anderen Programme ausgeführt wurden. Wenn Excel jedoch ein CPU-Segment abruft, gibt es dieses Segment nicht auf. Es wird nur die Konkurrenz für die nächste CPU-Zeitscheibe verlieren.
MSalters
3

In VBA oder über eine Deklaration stehen Schlaf- und Wartefunktionen zur Verfügung. Die "übermäßig vereinfachte Faustregel" lautet jedoch, niemals Sleep () zu verwenden. (google "niemals sleep ()" programmieren ")

Dokumentseite für Application.Wait ( https://msdn.microsoft.com/en-us/library/office/ff822851.aspx ). Beachten Sie, dass "Ruhezustand" und "Warten" dazu führen, dass Excel für die von Ihnen festgelegte Dauer nicht mehr reagiert und dies zu Zeitscheiben "Zugunglücken" führen kann.

Wenn es sich bei Ihrer Berechnung um eine Schleife handelt, können Sie dies für Ihren speziellen Zweck (Verlust der Rechenzeit für die CPU-Verfügbarkeit) tun, indem Sie eine eigene spezielle Wartefunktion erstellen, die z. B. DoEvents () für 1 Sekunde und wiederholt dann kehrt zurück.

DoEvents weist Ihren Code / Interpreter grundsätzlich an, Zeit für das Betriebssystem usw. aufzugeben. Dies führt definitiv dazu, dass Ihr Code länger dauert. Möglicherweise können Sie das Arbeitsblatt auch bearbeiten, während die Berechnung ausgeführt wird, sodass die Laufleistung variieren kann. Prüfung.

Siehe zum Beispiel https://stackoverflow.com/questions/469347/is-there-an-equivalent-to-thread-sleep-in-vba

Yorik
quelle
0

Ich hatte das gleiche Problem, als mein Laptop 4 GB Speicher hatte. Sobald ich ein Upgrade auf 16 GB bekam, hörte das Problem auf. Nur eine andere mögliche Lösung.

RPh_Coder
quelle
0

Fügen Sie die folgenden 2 Zeilen in der Nähe des Starts Ihres Makros hinzu:

'Turn off screen updating

 Application.ScreenUpdating = False

Und diese 2 Zeilen am Ende:

'Turn screen updating back on

 Application.ScreenUpdating = True

Es wird dann weniger Arbeit zu tun haben, während Sie etwas anderes tun.

Loppy
quelle
-2

Wenn Sie ein 32bi-Büro in einem 64-Bit-Betriebssystem verwenden, sollten Sie diese App verwenden: http://www.ntcore.com/4gb_patch.php

Diese App wird es Excel oder jedem anderen 32-Bit-Büro ermöglichen, mo zu verwenden

diasje
quelle
Bei der Frage geht es um die Begrenzung der CPU. Bei Ihrer Antwort geht es darum, AWE für Apps zu aktivieren, die AWE wahrscheinlich nicht einmal nutzen werden.
Martheen Cahya Paulo
-5

Verwenden Sie OpenOffice oder LibreOffice: Die Skriptleistung ist viel effektiver als die von MS, und Sie können Ihre Berechnungen buchstäblich "drosseln".

EDIT: Warum downvote? Schauen Sie sich das Handbuch an und überzeugen Sie sich selbst. Sie können Ihre Berechnungen auf Java und sein konvertieren ganz gut mit allen Drosselleistung der JVM, zum Beispiel.

Alexey Vesnin
quelle
3
Ich habe nicht abgelehnt, aber ich gehe davon aus, dass Sie eine Problemumgehung anstelle einer Lösung für die sehr direkte Frage vorgeschlagen haben, die im OP gestellt wurde: "Gibt es eine Möglichkeit, die CPU-Auslastung zu begrenzen, auf die Excel während der Ausführung Zugriff hat? "
Monkpit
@Monkpit Meine Geschichte mit OpenOffice begann mit einem ähnlichen Problem. Die Portierung aller Dokumente dauerte ungefähr eine Woche. Danach habe ich jedoch die Meinung vertreten, dass ich MS Office nie wieder verwenden werde.
Alexey Vesnin
OpenOffice ist Office weit überlegen, da 99% der Benutzer Office über Libre verwenden, also Entwickler (wahrscheinlich wie dieser Typ). Deshalb habe ich abgestimmt.
Thomas Shera
@ThomasShera Naja, ich kann das überhaupt nicht verstehen - warum können Microsoft-Leute so lange nicht einfach das Zeug reparieren ? Nein, es werden keine neuen Dinge benötigt, keine Addons - Sie müssen nur
sicherstellen,