Schleife wird gegen Ende immer langsamer
09.12.2022 20:44:52
Klexy
Ich habe ein Tabellenblatt "Angebot", das in den Spalten C-I Text enthält, davon sind 300 verbundene Zellen. Die Zellverbünde sind alle einzeilig. In manchen dieser Verbundzellen sind (variable) längere Texte enthalten, die nicht vollständig angezeigt werden, wenn man die Zeilen nur mit "Start > Zellen > Format > Zeilenhöhe automatisch anpassen" auf optimale Höhe bringen will.
Zu diesem Zweck habe ich ein Makro (Button "Zeilenhöhe anpassen"), das in einer Schleife alle Zellen in den Spalten C-I durchgeht und bei Zellverbünden (MergeArea) die Zeilenhöhe anpasst. Das Makro bearbeitet die jeweils markierten Zellen im UsedRange. Daher müssen zum Start des Makros die Spalten C-I markiert sein.
Funktioniert prima, aber ab ca. Zellverbund Nummer 200 wird das Makro deutlich und zunehmend langsamer. Zu Beginn braucht es ca. 1/10 Sekunde pro Zellverbund, bei Nummer 300 dann ca. 7 Sekunden. Ich habe zu diesem Zweck einen Zeitmesser eingebaut, der mir nach jeweils 20 Verbundzellen die Zeit misst. Diese Rundenzeiten werden am Ende in Spalte V ausgegeben (früher gemessene Rundenzeiten werden nach rechts verschoben).
Interessant ist auch, dass das Makro immer unterschiedlich lange braucht, obwohl alle Parameter immer identisch sind und sonst nix auf dem Computer läuft.
Irgendwo läuft da ein Speicher voll.
Musterdatei: https://www.herber.de/bbs/user/156637.xlsm
Hier ist eine weitere Excel-Datei, in der ich den ganzen Makro-Code ausgelesen habe, was die Übersicht erleichtert: https://www.herber.de/bbs/user/156638.xlsm
Ich verwende in der Firma Office 365 (lokale Installation) (=blaue Rundenzeiten) und habe es zuhause auf meinem über 6 Jahre alten Rechner mit Office 2013 laufen lassen, wo es insgesamt schneller, aber auch ab 200 langsamer läuft (=rote Rundenzeiten). Ich meine, dass dieses Problem früher mit Office 2010 nicht aufgetreten ist; das steht mir aber nicht mehr zur Verfügung. Zumindest sind alle meine komplexen Makros mit 2010 viel schneller gelaufen als mit 365. Und auch seltener eingefroren.
Wer weiß, was das ist und vor allem, was man dagegen tun kann?
Bei Hinweisen, die zur Festnahme und Verurteilung des Verdächtigen führen, winken beste Nürnberger Lebkuchen.
Off Topic:
Ein vermutlich damit zusammenhängendes Problem habe ich wenn ich (in einem anderen Fall) zwei lange Makros nacheinander von einem Master-Makro aus aufrufe. Das zweite geht in Schleife alle Zeilen der Tabelle durch, prüft sie und modifiziert sie ggf. Irgendwann heißt es dann "Nicht genügend Speicher vorhanden". Wenn man OK drückt, läuft das Makro trotzdem noch viele Zeilen weiter und sagt dann wieder "Nicht genügend Speicher vorhanden". Das könnte man theoretisch bis zum Ende der Tabelle wiederholen und hätte das gewünschte Ergebnis. Das würde aber ewig dauern.
Wenn ich die beiden Makros nacheinander von Hand anstoße, kommt die Fehlermeldung auch. Wenn ich Excel (ganze Applikation) aber schließe und die Datei neu aufrufe, läuft das zweite Makro problemlos durch (möglicherweise gegen Ende auch langsamer, was ich aber bisher nicht nachgemessen habe).
Irgendwo läuft da ein Speicher voll. Es ist übrigens das Makro, das in der zweiten Datei den Code farblich formatiert.