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

VBA Performance Delete

VBA Performance Delete
30.12.2020 06:45:48
Rainer-Franz
Guten Morgen liebe Forumsleut,
ich muss mal wieder um Rat/Hilfe bitten, da ich etwas verunsichert bin. Aus Performance-Gründen habe ich alle .Select/Activate Anweisungen kürzlich verbannt, bzw. versuche komplett alles auf VBA Ebene zu verlagern.
So auch nachfolgenden Codeschnipsel (kleiner Auszug), der relativ schnell im Vergleich zu früheren Codes, Anfangs purer MakroaufnahmeCode, dann immer wieder etwas verbessert, nun so die gewünschten Daten löscht:
Dim WS15Mdel, lastrow15M
lastrow15M = WS15M.Cells(Rows.Count, 11).End(xlUp).Rows.Row
For WS15Mdel = lastrow15M To firstrow1 Step -1
If WS15M.Cells(WS15Mdel, 7).Value "1" Then
WS15M.Rows(WS15Mdel).Delete Shift:=xlUp
End If
Next WS15Mdel
Mir ist nicht klar, wie ich WS15Mdel (Range der zu löschenden Zeilen) genau auf die Tabelle definiere, dies kommt mir zu pauschal vor, konnte aber nichts dahingehend ergooogeln (verrücktes Wort, ergoogeln....). Ich liebe Wortfindungen, z.B. Klönen & Telefonieren = Klönflonat. :) Sorry für den Spaß am Rande...
Ich werde jedoch das Gefühl nicht los, hier was übersehen zu haben, oder lässt sich dies nicht mehr besser performen.
Über Vorschläge würde ich mich freuen.
Daneben noch meine Frage zu Meinungen in die Runde:
Vor einiger Zeit, ich finde den Artikel nicht mehr, habe ich gelesen, dass UDFs, alle CPU-Kerne bei Berechnung nutzen, hingegen VBA-Code nur einen Kern der CPU nutzt. Ist dies richtig, sollte man dann nicht seine Formeln zu UDFs konvertieren und dann diese in den VBA-Code als Funktion integrieren?
Für Antworten bin ich sehr dankbar und wünsche schon einmal für Alle einen guten Rutsch in ein besseres, gesundes 2021.
Also DANKE vorab und liebe Grüße
Rainer

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Performance Delete
30.12.2020 07:06:40
Rainer-Franz
....der Vollständigkeit halber:
WS15M usw. wurde natürlich vorab aus dem Workbook/Worksheet definiert....
AW: VBA Performance Delete
30.12.2020 07:55:22
Werner
Hallo,
mal was grundsätzliches:
Dim WS15Mdel, lastrow15M

Wenn du beim Dim(ensionieren) keinen Datentyp angeibst, dann werden die Variablen als Variant deklariert. Du solltest auch den Datentyp angeben. Und firstrow1 ist überhaupt nicht deklariert.
Public Sub aaa()
Dim i As Long, loLetzte As Long, raLöschen As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
On Error GoTo Ende
With Worksheets("Tabelle1")
For i = .Cells(.Rows.Count, 11).End(xlUp) To 1 Step -1
If .Cells(i, 7)  1 Then
If raLöschen Is Nothing Then
Set raLöschen = .Cells(i, 1)
Else
Set raLöschen = Union(raLöschen, .Cells(i, 1))
End If
End If
Next i
If Not raLöschen Is Nothing Then raLöschen.EntireRow.Delete
End With
Ende:
On Error GoTo -1
Set raLöschen = Nothing
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
Ich würde die Zeilen nicht einzeln löschen. Erst die Zeilen, die gelöscht werden sollen in einer Range-Variablen sammeln und dann am Schluß alle auf einmal löschen.
Bei mir läuft die Schleife bis zur Zeile 1. Was deine Variable firstrow1 für einen Wert hat weiß ich halt nicht.
Gruß Werner
Anzeige
AW: VBA Performance Delete
30.12.2020 08:19:35
Rainer-Franz
Guten Morgen Werner,
vielen Dank, dass bringt mich weiter. firstrow1 ist am Codeanfang definiert. Application.ScreenUpdating, Application.EnableEvents, Application.Calculation usw, de-/aktiviere ich auch stets.
Aber der Hinweis zum genauen Datentyp und die entsprechenden Zeilen auf einmal zu löschen ist prima.
DANKE.
Liebe Grüße und guten Rutsch.
Rainer
AW: VBA Performance Delete
30.12.2020 08:52:07
Werner
Hallo,
wenn es sich um größere Datenmengen handelt, dann wäre eine Kombination aus Formeln und RemoveDuplicates eine sehr schnelle Alternative.
Aber da sollte ich dann mal eine Beispielmappe von dir haben mit ein paar Beispieldaten, dann könnte ich dir das zusammenschreiben.
Gruß Werner
Anzeige
AW: VBA Performance Delete
30.12.2020 10:27:46
Rainer-Franz
Hallo Werner,
WOW!! Das ist sehr nett und freundlich von Dir.
Eigentlich war der betriebene Aufwand von mir wohl unangemessen, denn diese Daten müssen nur quartalsweise aufgearbeitet werden, hätte ich auch händig oder mit dem Makrorekordercode machen können. Aber ich fand es so angenehmer, auch da es eine stupide Arbeit gewesen wäre, die Löschungen/Aufarbeitung der Daten in über 40 Tabellenblätter von Hand vorzunehmen. Aber es macht tatsächlich Freude, wenn selbstgestrickte Codes funktionieren.
Habe mir auch nur Anregungen im Web und hier im Forum geholt, um ein Verständnis dafür zu bekommen. Einfach nur verfügbare Codes/Skripte zu verwenden ist nicht so mein Fall, dabei lernt man kaum was dazu.
Nochmal an Dich Werner einen besonderen Dank, gern würde ich nötigenfalls mal auf Dein tolles Angebot zurückkommen, wenn ich mal überhaupt nicht weiterkomme.
In diesem Sinne wünsche ich Dir Werner, Euch und Euren Familien einen guten Rutsch in ein wundervolles 2021, verbunden vor allem mit kerniger Gesundheit, einem Höchstmaß an Zufriedenheit für Lebensfreude und Glück. Hoffen wir, die Corona-Pandemie bald nur noch als schlimme Erinnerung wahrnehmen zu müssen.
Liebe Grüße
Rainer
Anzeige
AW: VBA Performance Delete
30.12.2020 15:34:39
Rainer-Franz
Hallo Werner,
nochmals Danke, Deine Variante hat die Verarbeitungszeit fast halbiert! KLASSE!!
Liebe Grüße
Rainer
AW: VBA Performance Delete
30.12.2020 19:38:52
Werner
Hallo,
und mit der angesprochenen Version wäre es wahrscheinlich nochmal um Welten schneller.
Gruß Werner
AW: VBA Performance Delete
31.12.2020 14:07:46
Rainer-Franz
Hallo Werner,
bin Dir erneut zum Dank verpflichtet. Habe mich mit Remove.Duplicates befasst und bin dann auf die Variante gekommen, entsprechend zu sortieren, die Beginnzeile des zu löschenden Zeilenbereiches zu ermitteln und in einem Schwung zu löschen. Dank Dir nochmals die Verarbeitungszeit um 90% reduziert.
Also DANKE und guten Rutsch!
Liebe Grüße
Rainer ...Top Forum hier!
+++++++++++++++++++++++++++++++++++++++++++++
Sub Tools_Zeilen_Bedingung_sortiert_löschen_VBA()
Dim verarbeitungszeit As Double
Dim infoverarbeitungszeit As String
verarbeitungszeit = Timer
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Dim myWB As Workbook
Set myWB = ThisWorkbook
Dim WS15M As Worksheet
Set WS15M = myWB.Sheets("test")
Dim firstrow1 As Long
Dim lastrow1 As Long
Dim firstdelrng1 As Range
Dim firstdelrow1 As Long
firstrow1 = 7
lastrow1 = WS15M.Cells(Rows.Count, 11).End(xlUp).Rows.Row
Range(WS15M.Cells(firstrow1, 7), WS15M.Cells(lastrow1, 15)).Sort Key1:=Range("G7"), Order1:= _
_
_
xlAscending
Set firstdelrng1 = Range(WS15M.Cells(firstrow1, 7), WS15M.Cells(lastrow1, 7)).Find("2")
firstdelrow1 = firstdelrng1.Row
WS15M.Rows(firstdelrow1 & ":" & lastrow1).Delete
Set firstdelrng1 = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
infoverarbeitungszeit = Round(Timer - verarbeitungszeit, 2)
infoverarbeitungszeit = Format((Timer - verarbeitungszeit) / 86400, "hh:mm:ss")
MsgBox "Laufzeit Sekunden: " & infoverarbeitungszeit
End Sub

Anzeige
AW: VBA Performance Delete
31.12.2020 19:54:27
Hajo_Zi
offen bedeutet es soll noch eine Antwort kommen.
Warum ist dein Beitrag Offen.
Du willst doch was machen. Soll jemand vorbei kommen?
Das ist nur meine Meinung zu dem Thema.

AW: VBA Performance Delete
01.01.2021 06:23:23
Rainer-Franz
Prosit Neujahr! Ups, Sorry, dies habe ich übersehen. Mir wurde perfekt geholfen......
Auf ein gesundes und glückliches 2021!
Liebe Grüße
Rainer

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige