Auf meinem Quad-Core Acer Aspire S3 Ultrabook läuft ein VBA-Programm. Das Problem ist, dass es nur 25 % der CPU nutzt (die anderen Prozesse insgesamt nutzen ca. 1 %). Auf dem Laptop läuft Windows 8.0. Die Excel-Version ist 2013 (32-Bit). Es werden nur 55 % des System-RAM genutzt, wobei Excel die Hälfte dieser 55 % nutzt.
Ich denke, dass vielleicht nur 25 % genutzt werden, weil nur ein Kern von Excel verwendet wird. Ich habe jedoch nichts, was diese Theorie untermauert. Wie kann ich das Programm beschleunigen?
Danke.
Antwort1
Es klingt, als wäre das Programm, das Sie verwenden möchten, Single-Threaded, d. h. es kann nur einen einzigen Kern verwenden und weiß nicht, dass die anderen vorhanden sind. Es gibt wirklich keine konkrete Möglichkeit, dies zu beschleunigen, außer einen Prozessor mit einer schnelleren Single-Core-Taktfrequenz zu kaufen oder ein Programm zu verwenden, das Multi-Threading unterstützt.
Antwort2
Alles unten gilt für Excel 2007 und früher. Laut derVerknüpfung@Ƭᴇcʜιᴇ007 hat in den Kommentaren oben geschrieben, dass es in Excel 2013 eine gewisse native Unterstützung für Multithreading gibt. Trotzdem gilt die Warnung, es einfach zu vergessen, sofern Sie kein erfahrener Programmierer sind.
Leider unterstützt VBA kein Multithreading, daher sind Ihre VBA-Berechnungen auf einen Kern Ihres Prozessors beschränkt.
Es gibt jedoch eine fortgeschrittene Methode, VBA dazu zu bringen, mehrere Threads auszuführen, indem VBscript-Dateien generiert und gleichzeitig ausgeführt werden. Dadurch wird das Problem umgangen, indem Ihr Code außerhalb des Excel-Prozesses ausgeführt wird und Windows die den verschiedenen Threads zugewiesenen Ressourcen verwalten kann.
Damit dies funktioniert, müssen Sie die Logik Ihres Codes höchstwahrscheinlich komplett überdenken (d. h. Sie müssen herausfinden, wie Sie die Aufgaben so aufteilen, dass sie sinnvoll gleichzeitig ausgeführt werden können), was für Ihr Projekt möglicherweise nicht machbar ist. Ich habe dies selbst nie implementiert, daher kann ich Ihnen dabei nicht wirklich weiterhelfen, als Ihnen zu sagen, was ich Ihnen bereits gesagt habe.
Wenn Sie jedoch in das Kaninchenloch eintauchen möchten, hier ist eininteressanter Blogbeitragdas zeigt ein Beispiel, wie das funktioniert. Aber Vorsicht: Wenn Sie kein versierter Programmierer sind, können Sie diese Idee vergessen und einfach akzeptieren, dass VBA in einem einzigen Thread ausgeführt wird.
Weitere Ressourcen auf Stack Overflow für die Wagemutigen:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
Es gibt natürlich auch andere Möglichkeiten, Ihren VBA-Code zu optimieren, ohne mehrere Threads zu verwenden. Ohne Ihren Code zu sehen, ist es unmöglich, gezielte Vorschläge zu machen, aber hier sind einige der üblichen Verdächtigen:
- Laden Sie Daten aus Ihrem Blatt in ein Array, um die Verarbeitung zu beschleunigen. Interaktionen mit dem Arbeitsblatt sind ein großer Engpass bei der VBA-Ausführung und können durch die Arbeit mit Arrays minimiert werden.
- Ein damit verbundenes Problem ist, dass Excel die Arbeitsmappe nach jeder Änderung an einer Zelle neu berechnet. Dies kann durch die Einstellung vermieden werden
Application.Calculation = xlManual
. Stellen Sie einfach sicher, dass Sie es wieder auf setzen,Application.Calculation = xlAutomatic
bevor Sie Ihr Sub beenden.
Antwort3
Wie andere bereits sagten, ist VBA von Haus aus nicht multithreadfähig. Wenn Sie die Geschwindigkeit erhöhen möchten, sollten Sie erwägen, benutzerdefinierte Funktionen (UDF) in einer anderen Sprache zu schreiben.
Ich würde Ihnen ExcelDNA und die Verwendung von C# oder VB.Net empfehlen. Sie sind sehr einfach zu verwenden, wenn Sie bereits wissen, wie man C# schreibt, und Sie können Multithreading innerhalb der UDF steuern.
Antwort4
Wie die anderen oben bereits gesagt haben, wäre Threading die Antwort, aber es ist keine wirklich praktikable Lösung, und ein Upgrade auf 64 Bit würde einen vernachlässigbaren Unterschied machen. Sie könnten beispielsweise versuchen, die Priorität des Prozesses zu erhöhen. Sie können sehen, wie das geht.Hier.
Es lässt sich schwer sagen, ob Ihr Skript dadurch schneller wird, da möglicherweise an einer anderen Stelle im Programm ein weiterer Engpass vorliegt (z. B. beim Lesen/Schreiben von der Festplatte), aber Windows erkennt dadurch zumindest, dass es eine höhere Priorität als Ihre anderen Prozesse hat.