Anzeige
Archiv - Navigation
1720to1724
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

einfaches Makro sehr langsam

einfaches Makro sehr langsam
08.11.2019 13:30:38
Klaus
Hallo FOrum,
ich habe ein sehr einfaches Makro, das dürfe für Excel überhaupt kein Problem sein. Die üblichen Geschwindigkeitstricks habe ich auch drin. Trotzdem läuft es irre langsame 38 Sekunden, in denen Excel auch noch auf "keine Rückmeldung" schaltet.
in Tabelle1 und Tabelle4 sind nur jeweils ein paar hundert Zeilen * ein dutzend Spalten vorhanden, die Datei ist vor dem löschen 295kb groß. Es handelt sich also nicht um eine Monstertabelle mit millionen Einträgen! Nach dem löschen hat die Datei noch 276kb. Drücke ich dann den löschen-Button nochmal, läuft das Makro in 0,4 Sekunden durch - es dauert also tatsächlich Zeit, die Daten zu löschen.
Der Übeltäter ist natürlich "Cells.ClearContents". Gibt es eine schnellere Möglichkeit, ein Blatt komplett zu löschen?
LG,
Klaus

Private Sub CommandButton2_Click()
Dim t
t = Timer
GetMoreSpeed True
Range("A3:A3000").ClearContents
Range("G3:G3000").ClearContents
Range("L3:L3000").ClearContents
Range("P3:P3000").ClearContents
Range("T3:T3000").ClearContents
Range("AB1:AB12").ClearContents
Range("AA1").ClearContents
Tabelle1.Cells.ClearContents
Tabelle4.Cells.ClearContents
GetMoreSpeed False
MsgBox Timer - t
End Sub
Public Static Sub GetMoreSpeed(Optional ByVal Modus As Boolean = True)
Dim intCalculation As Integer
If Modus = True Then intCalculation = Application.Calculation
With Application
.ScreenUpdating = Not Modus
.EnableEvents = Not Modus
.Calculation = IIf(Modus = True, xlManual, intCalculation)
.Cursor = IIf(Modus = True, 2, -4143)
End With
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: einfaches Makro sehr langsam
08.11.2019 13:34:32
EtoPHG
Hallo Klaus,
Gibt es eine schnellere Möglichkeit, ein Blatt komplett zu löschen?
Ja. Blatt löschen und neu Erstellen!
Gruess Hansueli
AW: einfaches Makro sehr langsam
08.11.2019 13:51:22
Klaus
Hmmm ...
aber dann bekomme ich doch auf alle meine Formeln #BEZUG! Fehler?
LG,
Klaus
Auf welche Formeln? Sehe ich deine Datei? (owT)
08.11.2019 13:58:31
EtoPHG

AW: einfaches Makro sehr langsam
08.11.2019 14:01:17
Daniel
HI
wenn du Formeln hast, die auf diese Zellen verweisen, darfst du die Zellen oder das Blatt nicht komplett löschen, sondern nur leeren, dh. so wie du es bisher gemacht hast.
(ich denke mal, dass Hansueli bei seinem Vorschlag davon ausgegangen ist, dass du solche Formeln NICHT hast)
bedenke auch, dass auch mit GetMoreSpeed deine Formeln einnmal neu berechnet werden, nämlich dann wenn du die automatische Neuberechnung wieder einschaltest.
ggf. müsste man mal dein Formelwerk überarbeiten und schauen, ob man das optimieren kann.
Gruß Daniel
Anzeige
AW: einfaches Makro sehr langsam
08.11.2019 19:13:10
Klaus
dass auch mit GetMoreSpeed deine Formeln einnmal neu berechnet werden
Daran hatte ich tatsächlich nicht gedacht, Daniel. Guter Tip.
Aus akademischem Interesse werde ich Hansuelis Tip auch mal probieren :-)
Aber erst Montag! Bis dahin schönes Wochenende euch allen.
LG,
Klaus M.
AW: einfaches Makro sehr langsam
08.11.2019 13:39:36
Daniel
Hi
ist jetzt schwer zu sagen.
du kannst die Zellbereiche in einen Schritt löschen:
Range("A3:A3000,G3:G3000,L3:L3000,P3:P3000,T3:T3000,AB1:AB12,AA1").ClearContents

wenn das nichts bringt, solltest du mal die Datei hochladen, dann muss man schauen, ob irgendein Spezialfall vorliegt.
Gruß Daniel
Anzeige
AW: einfaches Makro sehr langsam
08.11.2019 14:07:58
Klaus
Hallo Daniel,
ich habe Tabelle 1 gefüllt, Tabelle 4 leer gelassen und den folgendermaßen modifizierten Code laufen lassen:
Private Sub CommandButton2_Click()
Dim t
t = Timer
GetMoreSpeed True
Range("A3:A3000,G3:G3000,L3:L3000,P3:P3000,T3:T3000,AB1:AB12,AA1").ClearContents
Debug.Print Timer - t
Tabelle1.Cells.ClearContents
Debug.Print Timer - t
Tabelle4.Cells.ClearContents
Debug.Print Timer - t
GetMoreSpeed False
End Sub
im Debug steht:
0
44,33594
44,33594
es dauert also Null Sekunden, den kombinierten Bereich zu löschen. Weitere 45 Sekunden den "vollen" Reiter zu löschen und wieder null Sekunden den leeren Reiter zu löschen. Drücke ich den Button ein zweites Mal, ergibt Debug:
1,953125E-02
1,953125E-02
1,953125E-02
Also = null für jeden Löschvorgang.
Spezialfall? Hochladen kann ich die Datei leider nicht, da Firmendaten. Und ein Muster erstellen bringt nichts, dann sähe man ja den Spezialfall nicht mehr :-(
Ich habe das Blatt aber mal von A1:ZZ10000 mit =ZUFALLSZAHL() gefüllt und das Makro laufen lassen. Das gesamte Blatt löscht sich innerhalb von akzeptablen 1,6 Sekunden - an der schieren Menge kann es also nicht liegen.
Die Originalfüllung des Blattes ist eine Kopie aus unserem ERP-System, das als LotusNotes Applikation läuft. Meines Erachtens macht diese Kopie aber nur Texte, keine Formate oder Formeln - was daran ein Spezialfall sein soll weiss ich nicht.
Naja, ich lege das ganze dann unter den X-Akten ab.
Danke!
LG,
Klaus M.
Anzeige
AW: einfaches Makro sehr langsam
08.11.2019 14:34:01
Piet
Hallo Klaus M
schau dir doch bitte beim naechstenmal nach dem Laden von Daten per MsgBox den UsedRange an! Bei Formeln wo die Zelle optisch leer ist sieht sie Excel meines Wissens trotzdem als "gefüllt" an. Erkennbar am UsedRange Bereich. Vielleicht siehst du so etwas was den "Superfall" erklaert?
mfg
Sub Test()
Dim k As Integer
For k = 1 To 4
MsgBox Worksheets(k).UsedRange.Address(0, 0)
Next k
End Sub

AW: einfaches Makro sehr langsam
08.11.2019 19:13:56
Klaus
Piet, das schaue ich mir Montag an. Bis dahin dir auch ein schönes Wochenende!
AW: einfaches Makro sehr langsam
11.11.2019 07:28:56
Klaus
Hallo Piet und sonstige,
die UsedRange des Blattes ist nicht außergewöhnlich - A1:Q260, damit sollte Excel kein Problem haben.
Inzwischen habe ich auch ein paar Sachen ausprobiert. Wie gesagt, ich kopiere eine Tabelle aus einem Lotus-Notes CRM System, dort mit dem Befehl "copy selected as table". Füge ich diese direkt in Excel ein, gibt es Zeilenrahmen und so weiter - und das löschen dauert, wie oben beschrieben. Füge ich es aber als "nur Text" ein, geht das löschen gewohnt schnell in unter einer halben Sekunde.
Für das langsame löschen, wird die Tabelle mit Formatierungen eingefügt, habe ich aber einen Workaround gefunden:
Private Sub CommandButton2_Click()
On Error GoTo fehler
GetMoreSpeed True
Range("A3:A3000,G3:G3000,L3:L3000,P3:P3000,T3:T3000,AB1:AB12,AA1").ClearContents
Sheets.Add
Tabelle1.UsedRange.Cut ActiveSheet.Range("A1")
Application.DisplayAlerts = False
ActiveSheet.Delete
Tabelle4.Cells.ClearContents
fehler:
GetMoreSpeed False
Application.DisplayAlerts = True
End Sub
Da ich die ganze Tabelle ausschneide, melden meine Formeln keinen #Bezug!. Das löschen eines gesamten Blatts geht rasend schnell.
Eine Lösung habe ich jetzt. Bleibt nur noch die akademische Frage: Warum kann das löschen von Formatierten Zellen so viel länger dauern? Meines erachtens werden aus LotusNotes auch nur Werte kopiert, zumindest stehen keine Formeln in den Zellen.
LG,
Klaus M.
Anzeige
AW: einfaches Makro sehr langsam
08.11.2019 14:40:48
Piet
Nachtrag
solltest du einen leeren Bereich hinter Zeile 3000 haben, wo keine Formeln darauf zugreifen, was passiert dann wenn du den Bereich als ganze Zeilen bis zum Blatt Ende löschtst? Geht das schneller?
Rows("3000:" & Rows.Count).Delete Shift:=xlUp
mfg Piet

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige