Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
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

Makro läuft ewig

Makro läuft ewig
14.09.2023 14:06:47
Hans
Liebes Forum,
ich brauche bitte Eure Hilfe. Ich habe ein Makro gebastelt. In einer Arbeitsmappe steht in einem Blatt in einer Spalte ca. 5000 Artikelnummern. Diese sollen in einem zweiten Tabellenblatt mit ca. 50000 Datensätzen gesucht und bei Übereinstimmung die komplette Zeile gelöscht werden. Der Artikel kann in der zweiten Tabelle nur einmal vorkommen.

Mein Makro:
Public Sub Makro1()
Dim WS1 As Worksheet: Set WS1 = Worksheets("Tabelle1")
Dim WS2 As Worksheet: Set WS2 = Worksheets("Tabelle2")
Dim lngRow As Long
Dim Z As Integer

With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
End With

Z = 0
For lngRow = 2 To WS2.Cells(Rows.Count, 1).End(xlUp).Row
If WorksheetFunction.CountIfs(WS1.Columns(1), WS2.Cells(lngRow, 3)) = 1 Then
WS2.Cells(lngRow, 1).EntireRow.Delete
Z = Z + 1
End If
Next lngRow

With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With

MsgBox Z & " Zeilen gelöscht"
End Sub

Das Makro läuft zwar, aber es dauert ewig. Was ist hier falsch bzw. was kann ich optimieren? Ich freue mich über Tipps. Vielen Dank im Voraus.
Hans

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro läuft ewig
14.09.2023 14:11:34
Oberschlumpf
Hi Hans,

du könntest mal per Upload eine Bsp-Datei mit Bsp-Daten in beiden Tabellenblättern.
Es müssen nicht 5000 sein, aber so 100 oder so wären vllt nicht schlecht.

Ich glaub, mit 2x For/Next UND Arrays könnte alles schneller sein.

Ciao
Thorsten
Makro läuft ewig
14.09.2023 14:53:51
volti
Hallo Hans,

da Du ja zum Suchen keine zweite Schleife sondern schon WorksheetFunction.CountIfs( verwendest, bringt ein Einlesen ins Array m.E. jetzt nicht so viel.

Ich denke, es liegt eher an den Löschbefehlen.
Ich würde die zu löschenden Zeilen eher in einem String sammeln und später in einer Aktion löschen.

Kannst ja mal testen, wieviel schneller das Ganze wird, wenn erst mal nichts gelöscht wird.

Gruß KH
Anzeige
Makro läuft ewig
14.09.2023 15:16:55
volti
Hallo,

hier noch ein ungetesteter Vorschlag und eine Ergänzung.

Public Sub Makro1()

Dim WS1 As Worksheet: Set WS1 = Worksheets("Tabelle1")
Dim WS2 As Worksheet: Set WS2 = Worksheets("Tabelle2")
Dim lngRow As Long
Dim Z As Integer
Dim sloeschen As String

With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
End With

Z = 0
For lngRow = 2 To WS2.Cells(Rows.Count, 1).End(xlUp).Row
If WorksheetFunction.CountIfs(WS1.Columns(1), WS2.Cells(lngRow, 3)) = 1 Then
sloeschen = sloeschen & "A" & CStr(lngRow) & ","
Z = Z + 1
End If
Next lngRow


If sloeschen > "" Then
sloeschen = Left$(sloeschen, Len(sloeschen) - 1)
WS2.Range(sloeschen).EntireRow.Delete
End If

With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With

MsgBox Z & " Zeilen gelöscht"
End Sub


Zum Löschen darf die Stringlänge w.M. aber nicht mehr als eine gewisse Anzahl an Zeichen enthalten (genaue Zahl habe ich jetzt vergessen) und muss ggf. geteilt werden oder mehrfach verwendet werden.

Man kann aber auch z.B. ins erste Feld was reinschreiben z.B. "wegdamit", nach Durchlauf der Schleife per Makro danach filtern und dann alles in einem Rutsch löschen. S. Vorschlag Sheldon

Gruß KH
Anzeige
Makro läuft ewig
15.09.2023 10:30:48
Hans
Ich konnte das Problem jetzt lösen. Ursache war eine vorhandene Pivottabelle in einem versteckten Tabellenblatt, nicht der Makrocode.
Herzlichen Dank für Eure Hilfe!!!
Mach das doch ohne Makro
14.09.2023 14:22:52
Sheldon
Hallo Hans,

vom Ablauf her würde es reichen mit einer Hilfsspalte in Tabelle2 zu arbeiten. Da schreibst du im Grunde die Formel aus deinem Makro rein, also

=ZÄHLENWENN(Tabelle1!A:A;Tabelle2!C4)>0


Im Anschluss setzt du einen Autofilter auf die Hilfsspalte und filterst WAHR. Dann kannst du die angezeigten Zeilen markieren und löschen. Oder du bringst deinem Makro diesen Ablauf bei, wenn es unbedingt per Makro laufen soll.


Gruß
Sheldon
Anzeige
Makro läuft ewig
15.09.2023 12:49:55
daniel
Hi
am schnellsten dürfte es so gehen:

Public Sub Makro1()

Dim WS1 As Worksheet: Set WS1 = Worksheets("Tabelle1")
Dim WS2 As Worksheet: Set WS2 = Worksheets("Tabelle2")
WS1.Usedrange.Sort Key1:=WS1.Cells(1, 1), order1:=xlascending, header:=xlyes
With WS2.Usedrange
with .Columns(.columns.Count, + 1)
.FormulaR1C1 = "=IFERROR(IF(VLookUp(RC3,'" & ws1.Name & "'!C1,1,1)=RC1,0,Row()),Row())"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlno
.ClearContents
end with
end with
End Sub


Gruß Daniel
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige