AW: Makro "schläft" ein
18.09.2007 14:36:00
fcs
Hallo Ben,
ich hab mir deine Prozeduren mal angsehen.
Dabei ist mir aufgefallen, dass du beim Löschen der Leerzeilen extrem viel Rechenleistung nur in die Aktualisierung der Fortschrittsanzeige im Userform1 investierts. Wenn du tatsächlich Datenfiles mit mehr als 10000 Datenzeilen verarbeitest, dann reicht es aus, wenn du alle 100 Zeilen die Anzeige aktualisierst.
Dazu muss du die Prozedur Leerzeilen ein wenig anpassen, indem du den Aufruf der Aktualisierung in eine kleine If-Bedingung packst.
Reicht es nicht aus, wenn du den Fortschritt in der Statuszeile anzeigst? Das dürfte den gesamten Ablauf erheblich beschleunigen.
Ein weiteres Problem in dieser Prozedur, du sammelst alle Leezeilen, die ggf. in mehren tausend Zeilen vorkommen können per Union in einem Range-Objekt. Das kann irgendwann zu einem Problem werden, da die Zeilen in einer entsprechenden Variablen gespeichert werden müssen. Ich schlage vor, hier die Zeilen in der Tabelle die Zeilen von der letzten Zeile zur Zeile 1 zu prüfen und in regelmäßigen Abstanden die gemerkten Leerzeilen zu löschen.
Ich hab die Prozedur mal entsprechend meinen obigen Anmerkungen angepasst und die Aufrufe der Fortschrittsanzeige zu Kommentaren gemacht.
Gruß
Franz
Sub Leerzeilen_loeschen()
' alle Leerzeilen löschen (aus Inet kopiert)
Dim LoI As Long, LoJ As Long, IntI As Integer
Dim RaZeile As Range
Dim PctDone As Single
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
LoJ = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
IntI = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
For LoI = LoJ To 1 Step -1
If Rows(LoI).SpecialCells(xlCellTypeBlanks).Count = IntI Then
If RaZeile Is Nothing Then
Set RaZeile = Rows(LoI)
Else
Set RaZeile = Union(RaZeile, Rows(LoI))
End If
End If
'ca. alle 100 Zeilen werden gemerkte Leezeilen gelöscht und Fortschritt aktualisiert
If LoI Mod 100 = 0 Then
If Not RaZeile Is Nothing Then
RaZeile.Delete
Set RaZeile = Nothing
' Prozentzahl updaten
PctDone = (LoJ - LoI) / LoJ
'Counter / (RowMax * ColMax)
Application.StatusBar = "Datei: " & ActiveWorkbook.Name & " Prozent geschafft: " _
& Format(PctDone, "00.0%")
' Call subroutine die den Fortschrittsbalken aktualisiert
' UpdateProgressBar PctDone
End If
End If
Next LoI
If Not RaZeile Is Nothing Then
RaZeile.Delete
Set RaZeile = Nothing
End If
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.StatusBar = False
' Unload UserForm1
End Sub