Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
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 Fehlersuche bzw. Optimierung

Makro Fehlersuche bzw. Optimierung
29.11.2022 09:44:12
Tom
Hallo,
da mir jetzt hier schon einmal sehr schnell und kompetent weiter geholfen wurde, hier ein weiteres Problem:
Ich habe zwei Datenreihen. In der ersten ganzzahlige x-Werte von 10 bis 5000 aufsteigend wobei jeder einzelne Wert öfters vorkommt und jeweils ein dazugehöriger y-Wert.
Kann man sich so vorstellen:
10 0,0001
10 0,0002
10 0,1234
10 0,4574
11 0,4344
11 0,9843
usw. (y-Werte hier rein zufällig)
Es soll folgendes gemacht werden: Es soll für jeden x-Wert der größte y-Wert erhalten bleiben. Die anderen Zeilen sollen gelöscht werden. Aus dem oberen soll also folgendes werden:
10 0,4574
11 0,9843
Mein Code sieht folgendermaßen aus:

Sub Reduktion2()
Dim j As Double
For j = 2 To 5000
If Cells(j, 1).Value = Cells(j + 1, 1).Value And Cells(j, 2).Value > Cells(j + 1, 2).Value Then
Cells(j + 1, 1).Delete Shift:=xlUp
Cells(j + 1, 2).Delete Shift:=xlUp
j = j - 1
ElseIf Cells(j, 1).Value = Cells(j + 1, 1).Value And Cells(j, 2).Value  "" Then
Cells(j, 1).Delete Shift:=xlUp
Cells(j, 2).Delete Shift:=xlUp
j = j - 1
End If
Next j
End Sub
Das Excel File hat ca. 65k Zeilen. Es gibt aber nur 4990 versch. x-Werte, deswegen läuft j nur bis 5000.
Beim ausführen bin ich noch nie zum Ende gekommen (nach 30min hab ich abgebrochen).
Braucht dieser Code für so viele Zeilen einfach solange? Falls ja, wie kann ich es optimieren?
Oder hab ich irgendwo eine Endlosschleife gebaut bzw. einen Fall nicht mitbedacht?
Hoffe irgendjemand sieht das Problem und kann mir helfen.

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 09:52:45
Rudi
Hallo,
Zeilen muss man von unten löschen.
For J =5000 to 2 Step -1
J sollte As Long sein.
Außerdem geht das auch mit Formeln.
Gruß
Rudi
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 10:25:07
Tom
Hallo, danke für die Antwort. Ich hab folgendes verändert:

Sub Reduktion2()
Dim j As Long
For j = 67679 To 2 Step -1
If Cells(j, 1).Value = Cells(j - 1, 1).Value And Cells(j, 2).Value > Cells(j - 1, 2).Value Then
Cells(j - 1, 1).Delete Shift:=xlUp
Cells(j - 1, 2).Delete Shift:=xlUp
ElseIf Cells(j, 1).Value = Cells(j - 1, 1).Value And Cells(j, 2).Value  "" Then
Cells(j, 1).Delete Shift:=xlUp
Cells(j, 2).Delete Shift:=xlUp
End If
Next j
End Sub
Wenn ich es anfange mit F8 schrittweise durchzugehen funktioniert es. Sobald ich aber F5 drücke um alles auszuführen (sonst drücke ich sehr lange F8) hängt sich Excel auf (oder braucht ewig ich habe aber wieder nach 15min abgebrochen)
Geht das irgendwie effektiver? (j muss hier bei 67000 beginnen, weil von unten nach oben ja alle Zeilen berücksichtigt werden müssen). Wie meinst du das mit Formeln?
Viele Grüße
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 11:57:16
Der
Hallo,
Tabellenoperationen (z. B. Zeilen löschen) brauchen viel Zeit. Daher läuft das Makro von dir wahrscheinlich seeeeeeehhhr langsam.
Man könnte versuchen, mehrere Zeilen in einem Rutsch zu löschen, z. B. mittels Autofilter. Das kann aber auch lange dauern, wenn daraus sehr viele nicht zusammenhängende Bereiche entstehen.
Alternativ könnte man die Daten in ein Array schreiben, dort durchgehen, die zu behaltenden Daten in ein zweites Array schreiben, welches man dann in die Tabelle schreibt.
Gruß
Michael
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:00:24
Der
Ergänzung: Da Du ja den größten Wert der ganzzahligen Werte haben willst, könnte es sinnvoll sein ein dictionary oder eine collection zu verwenden. Das ist zwar etwas langsamer als ein Array (wenn es sehr viele Werte sind) aber für diesen Zweck ganz gut geeignet.
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:09:44
Tom
Hey, Danke für deine Antwort.
Ich hab es jetzt einmal noch durchlaufen gelassen, 45min hat es gedauert (also keine dauerhafte Lösung).
Dass Arrays schneller sind wusste ich nicht. Mit dictionarys oder collections hab ich noch nie gearbeitet, ich versuch es also mal mit einem Array.
Falls ich es nicht hinbekomme darf ich mich sicher nochmal melden ;)
Viele Grüße
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:16:01
Oberschlumpf
nur mal so ne Frage:
ist Zeile 67679 wirklich die letzte, benutze Zeile, in der auch ein Wert drin steht?
wenn nein, trag anstelle von 67679 die wirklich letzte, genutzte zeile in For/Next ein und lass das Makro von Rudi noch mal laufen - wie lange dauert das Ganze jetzt?
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:23:37
Der
Hier mal ein Beispiel für ein Dictionary:

    Sub Reduktion3()
Dim j As Long
Dim arrData As Variant
Dim dicResult As Object
Set dicResult = CreateObject("Scripting.Dictionary")
arrData = ActiveSheet.Cells(2, 1).Resize(4998, 2).Value    'hier ggf. die Range-Größe anahnd des letzten Eintrags ermitteln
For j = 1 To UBound(arrData)
If dicResult.exists(arrData(j, 1)) Then
If dicResult(arrData(j, 1)) 

AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:25:41
Der
Um die Werte an die Stelle der ursprünglichen Werte zu schreiben:

    Sub Reduktion4()
Dim j As Long
Dim arrData As Variant
Dim dicResult As Object
Set dicResult = CreateObject("Scripting.Dictionary")
arrData = ActiveSheet.Cells(2, 1).Resize(4998, 2).Value    'hier ggf. die Range-Größe anahnd des letzten Eintrags ermitteln
For j = 1 To UBound(arrData)
If dicResult.exists(arrData(j, 1)) Then
If dicResult(arrData(j, 1)) 

Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 13:01:56
Tom
Hallo,
deine Lösung funktioniert auch perfekt :) Danke! Jetzt hab ich drei Lösungen und die Qual der Wahl was ich denn jetzt nehme :)
Viele Grüße
WorksheetFunction.Transpose ...
29.11.2022 13:17:36
Rudi
Hallo,
... funktioniert nur bis zu ca. 64.000 Elementen. Danach ist Schluss. Deshalb schaufele ich die Daten immer in ein Ausgabearray.
Ist auch nicht langsamer als Transpose.
Gruß
Rudi
AW: WorksheetFunction.Transpose ...
29.11.2022 13:21:13
Daniel
Teste mal, ich meine, dass das Limit von Transpose seit ein paar Excel-Versionen nicht mehr gilt.
Gruß Daniel
AW: WorksheetFunction.Transpose ...
29.11.2022 13:46:26
Rudi
Hallo,
bis 65536 geht's. Danach werden 65536 abgeschnitten.
a= Range("A1:A65537")
ergibt a(1 To 65537, 1 To 1)
a=Worksheetfunction.Transpose(a)
ergibt a(1 To 1).
Gruß
Rudi
Anzeige
AW: WorksheetFunction.Transpose ...
29.11.2022 14:02:35
Der
Der Hinweis ist gerechtfertigt. Die Grenze ist meines Wissens 65536. Das Problem besteht, soweit ich weiß, weiterhin (zumindest bei meinem xl2019), so dass immer nur die letzten Elemente verarbeitet werden, die über ein Vielfaches von 65536 hinaus gehen.
Nach der vom OP geschilderten Sachlage sind es nicht so viele Einträge, zumal ja nur jeweils die Maxima übrig bleiben. Wenn also je Eintrag durchschnittlich 3 Werte vorhanden sind verbleiben danach nur noch 1/3 der Daten im Dictionary. Somit könnten theoretisch fast 200.000 Ursprungsdaten verarbeitet werden, ohne dass es zu Problemen mit der Funktion kommt.
Wenn es mehr sein können ist natürlich der Umweg über das Array sinnvoll.
Anzeige
AW: WorksheetFunction.Transpose ...
29.11.2022 14:29:52
Daniel
Die Schleife ist auch schneller
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:07:43
Rudi
Hallo,
teste mal:

Sub Reduktion()
Dim j As Long
Dim vntIN, vntOUT(), objOUT As Object, oObj
Set objOUT = CreateObject("scripting.dictionary")
vntIN = Cells(1, 1).CurrentRegion
For j = 2 To UBound(vntIN)
objOUT(vntIN(j, 1)) = Application.Max(objOUT(vntIN(j, 1)), vntIN(j, 2))
Next j
ReDim vntOUT(1 To objOUT.Count + 1, 1 To 2)
j = 1
vntOUT(j, 1) = "X"
vntOUT(j, 2) = "Y"
For Each oObj In objOUT
j = j + 1
vntOUT(j, 1) = oObj
vntOUT(j, 2) = objOUT(oObj)
Next
Worksheets.Add.Cells(1, 1).Resize(UBound(vntOUT), 2) = vntOUT
End Sub
Schreibt die Daten in ein neues Blatt.
Gruß
Rudi
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:38:26
Tom
Hallo,
das funktioniert schonmal perfekt. Von 45min bei meinem Code runter auf ca. 5sek ist denke ich eine stabile Verbesserung ;) Ich probiere jetzt auch noch die Lösungen der anderen aus, das schnellste nehme ich dann einfach :)
Viele Grüße
bei mir ...
29.11.2022 12:48:24
Rudi
...braucht das für 100000 Zellen 0,8 Sekunden. Und meine Kiste ist nicht die schnellste.
Gruß
Rudi
AW: bei mir ...
29.11.2022 12:51:40
Tom
Hallo,
du hast absolut Recht, ich hatte gerade zu viel gleichzeitig am Laufen, im Task Manager war alles voll ausgelastet. Es dauert keine Sekunde.
Viele Grüße
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 14:44:42
Tom
Hey,
kann man deine Lösung auch dahingehend anpassen, dass direkt im Makro das neue Tabellenblatt den Namen vom alten bekommt und das alte Tabellenblatt gelöscht wird? Damit eine Tabellenblattflut verhindert wird?
Viele Grüße
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
30.11.2022 09:16:51
Rudi
Hallo,
statt Worksheets.Add.....

  With ActiveSheet.Cells(1, 1)
.CurrentRegion.ClearContents
.Resize(UBound(vntOUT), 2) = vntOUT
End With
Gruß
Rudi
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 12:12:13
Daniel
Hi
1. sortiere die Liste nach X und nach Y absteigend (also,dass der größte Y-Wert oben steht.)
2. wende dann die Menüfunktion Daten - Datentools - Duplikate entfernen an mit der X-Spalte als Kriterium
Das geht sehr schnell
Gruß Daniel
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 13:04:42
Tom
Hallo,
danke, auch das funktioniert :)
Viele Grüße
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 13:22:34
Daniel
Bewerte auch mal Programmieraufwand und notwendiges VBA-Fachwissen.
Gruß Daniel
Anzeige
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 13:54:09
Tom
Alles klar.
Mit dem Sortieren hast du genau etwas erwischt was ich gestern brauchte, deswegen konnte ich es. (Aber auch nur weil ich einen Kollegen gefragt habe). Hätte ich das "Vorwissen" (wenn man das so nennen kann ;) ) nicht gehabt, hätte ich es mit meiner jetzt 2 Wöchigen Erfahrung wahrscheinlich nicht geschafft, da ich logischerweise viele Vba Funktionen noch nicht kenne. Der Aufwand an sich ist natürlich sehr niedrig. Aber bis ich mal herausgefunden habe, für was es einen Befehl in Vba gibt bzw. für was nicht wird es noch dauern. Deswegen kann ich die Schwierigkeit nicht komplett bewerten. Meine Programmiererfahrung bisher ist rein aus dem Studium (ein Semester C, eins C++ und eins C#). Hoffe das hilft dir weiter.
Viele Grüße
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 14:32:34
Daniel
Naja, du schreibst "Excel gut".
Da sollte man sortieren und Duplikate entfernen als Standardfunktionen von Excel kennen.
Wenn man es im Makro braucht, hilft der Recorder
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 14:42:16
Tom
Ja das kenne ich auch. Nur sind Makros und Excel für mich zwei komplett verschiedene Dinge. Nur weil ich jetzt weiß wie man z.b. eine Zelle formatiert, kann ich es noch nicht in Vba. So ist es auch mit dem Sortieren.
Im Code steht z.b.

order1:=xlascending, key2:=.Cells(1, 2), Order2:=xldescending
Da drauf komme ich nicht nur weil ich die "normale Sortierfunktion" von Excel kenne. Das was ich meine ist die Beschreibung dieser Funktionen in Vba, da kenne ich noch nicht viele. (An den Recorder hab ich dummerweise nicht gedacht, das wäre natürlich ne Idee).
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 15:24:51
Daniel
Ja genau dafür ist der Recorder da.
Er kann zwar nicht besonders gut fertige Programme schreiben, aber um nachzuschauen, wie man Excelfunktionen in VBA umgesetzt werden, ist er brauchbar und man sollte sich mit ihm vertraut machen.
Wie du siehst, kann man oft mit wenig Aufwand und wenig "echtem" Programmiererwissen leistungsfähige Programme schreiben, wenn man die Excelfunktionen in Makros nutzt.
AW: Makro Fehlersuche bzw. Optimierung
29.11.2022 13:05:03
Daniel
Und als Code

With Range("A:B")
.sort Key1:=.Cells(1, 1), order1:=xlascending, key2:=.Cells(1, 2), Order2:=xldescending, Header:=xlyes
.RemoveDuplicates 1, xlyes
End With
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige