Speicherfehler für Makros (Microsoft Excel)
Jeff verfügt über eine ausgefeilte Excel-Arbeitsmappe, in der mithilfe von VBA zahlreiche Berichte im PDF-Format erstellt werden. Es läuft hervorragend unter Excel 2013 32-Bit auf mehreren PCs. Umgekehrt erhält Jeff auf mehreren anderen PCs, auf denen Office 365 ausgeführt wird, nach der Hälfte der Ausgabe den Fehler „Nicht genügend Speicher“.
Daher funktionieren die Makros perfekt mit der älteren Version von Excel, jedoch nicht mit der neuesten Version. (Jeff hat dies erneut auf mehreren PCs getestet, damit die Ergebnisse wiederholt werden können.) Jeff fragt sich, ob in Office 365 Speicherlecks oder Makrounterschiede bekannt sind, die dieses Problem verursachen könnten.
Im Allgemeinen hat die Speichernutzung mit einem Hauptproblem zu tun – Variablen und wie sie in Ihrem Makro verwendet werden. Es kommt speziell mit variablen Arrays ins Spiel. Es ist immer eine gute Idee, sicherzustellen, dass Sie alle Ihre Variablen deklarieren (verwenden Sie die Option Explicit-Direktive, um diesbezüglich zu helfen) und Ihre Array-Dimensionierung zu überprüfen, um sicherzustellen, dass Sie nicht versuchen, ein wahnsinnig großes Array zu deklarieren.
Objektvariablen können auch viel Speicher belegen. Wenn Sie das Schlüsselwort Set verwenden, um einer Variablen ein Objekt zuzuweisen, stellen Sie sicher, dass Sie die Objektvariable auf Nothing setzen, wenn Sie fertig sind. Dies ist besonders wichtig innerhalb von Schleifen. Wenn jeder Durchlauf durch die Schleife zur Deklaration einer anderen Objektvariablen führt und Sie diese Variable bei jeder Iteration der Schleife nicht löschen können, können Sie sehr schnell Speicher verbrauchen.
Es ist auch wichtig, die Bildschirmaktualisierung zu deaktivieren, während Ihr Makro seine Drehungen durchläuft. Wenn Ihr Makro versucht, den Bildschirm kontinuierlich zu aktualisieren, werden Ressourcen verwendet und Ihr Makro verlangsamt.
Man würde jedoch denken, dass in Jeffs Situation die Speichernutzung kein großes Problem darstellt. Immerhin wechselt er von einer 32-Bit-Version von Excel zu einer (höchstwahrscheinlich) 64-Bit-Version. Dadurch kann Excel einen größeren Speicherplatz als je zuvor nutzen. Daher würde man denken, dass „Out of Memory“ -Fehler weniger wahrscheinlich als wahrscheinlicher sind.
Leider gibt es hier einen Schraubenschlüssel, den man in die Mischung werfen kann. Wenn der Fehler „Nicht genügend Speicher“ angezeigt wird, ist möglicherweise nicht der Speicher der Schuldige.
Microsoft hat im Laufe der Jahre dokumentiert, dass dieser bestimmte Speicher generischer Natur ist und durch fast alles verursacht werden kann. (In meinem Buch macht das die Fehlermeldung unbrauchbar, aber wer bin ich, um Microsoft zu befragen. Frustrierend!)
Die andere Sache, die ich in Betracht ziehen würde (ohne Jeffs Code gesehen zu haben), ist sicherzustellen, dass Sie nicht linear programmieren. Mit anderen Worten, teilen Sie Ihren Code in einzelne Unterprogramme auf, die kleine, diskrete Aufgaben ausführen. Sie können dann jede Unterroutine von einer Hauptsteuerroutine aus aufrufen. Der Vorteil davon ist die Speicherverwaltung aufgrund des Umfangs.
Variablen haben nur innerhalb der Prozedur, in der sie verwendet werden, einen Gültigkeitsbereich.
(Nun, dies ist wahr, es sei denn, Sie erklären, dass sie einen globalen Geltungsbereich haben, aber das ist ein anderer Fischkessel.) Dies bedeutet, dass Variablen, die innerhalb einer Prozedur verwendet werden, zerstört und ihr Speicher automatisch freigegeben wird, wenn die Prozedur beendet wird.
Wenn Ihr Makro jedoch linear geschrieben ist, sodass keine Unterroutinen vorhanden sind, werden alle Variablen während der gesamten Laufzeit des Makros in Ihrem System beibehalten. Unter dem Gesichtspunkt der Speicherverwaltung ist es besser, Ihren Code in Prozeduren aufzuteilen, damit Sie die Speichernutzung minimieren können.
Der andere Vorteil der Modularisierung Ihres Codes auf diese Weise besteht darin, dass bei einem Fehler sogar das im Allgemeinen wertlose „Out of Memory“
auftritt Fehler – Er tritt wahrscheinlich innerhalb eines bestimmten Verfahrens auf, und Sie haben dadurch eine bessere Chance, genau zu bestimmen, wo der tatsächliche Fehler auftritt. Meiner Meinung nach ist diese Fähigkeit, den potenziellen Fehlerpunkt effizienter aufzuspüren, ein großer Vorteil.
Wenn das Problem dadurch immer noch nicht behoben wird, habe ich einige Berichte gesehen, wonach VBA beim Speichern Ihrer Arbeitsmappe gezwungen ist, eine Speicherbereinigung auf Ihrem Speicherplatz durchzuführen. Aus diesem Grund schlagen einige Leute vor, dass Ihr Makro die Arbeitsmappe von Zeit zu Zeit speichert und nicht nur am Ende des Makros. Ich weiß nicht, wie genau diese Berichterstellung ist, aber wenn Sie Ihr Makro bereits zum Speichern der Arbeitsmappe verwenden, kann es nicht schaden, wenn Sie sie häufiger als weniger speichern.
Es gibt noch eine letzte Sache, die erwähnt werden sollte. Wenn Sie jetzt Office 365 Business Premium verwenden, sind SharePoint Online und Excel Web App enthalten. Diese Versionen begrenzen daher die Größe einer Excel-Datei auf 10 MB. Wenn Ihre Datei sehr groß ist, hat sie unter Excel 2013 möglicherweise einwandfrei funktioniert, schlägt jedoch unter Office 365 Business Premium aufgrund dieser Dateigrößenbeschränkung fehl.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (13619) gilt für Microsoft Excel 2007, 2010, 2013, 2016, 2019 und Excel in Office 365.