Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

warum dauert Zeilen löschen 10 Sek.?

Forumthread: warum dauert Zeilen löschen 10 Sek.?

warum dauert Zeilen löschen 10 Sek.?
08.01.2026 09:47:25
Christian
Hallo,

ich hoffe ihr habt einen Rat was ich noch probieren könnte. Ich und auch Chatgpt sind mit unserem Latein am Ende.

Das Problem in meinem Blatt Codes! dauert das Löschen von Zeilen ca. 10 Sek. während das Berechnen von Formeln eine Sache von Sekundenbruchteilen ist.
In der ganzen Mappe gibt es nur 4 Formeln, alle im Blatt Codes,

in K1: =ANZAHL2(D:D), in K2: =ANZAHL2(E:E)

in F1:F88326 =WENN(E1>"";AUFRUNDEN(RANG.GLEICH(E1;E$1:INDEX(E:E;$K$1);0)/$K$2;2);"")

und in H1:H88326 =WENN(D1>"";"http://web.archive.org/web/20220630000000/https://www.imdb.com/name/" & D1 & "/";"")

Es gibt keine Worksheet Change Makros, die sich auf das Blatt auswirken und keine bedingten Formatierungen.

Was habe ich bereits getan?

das am Ende stehende Makro laufen lassen, um eventuell unnötige Formatierungen ect. zu entfernen
geprüft, mit Strg+Ende wo sich der genutze Bereich befindet (endet bei K88326)
die Inhalte des Blatts als Werte in eine neue Mappe eingefügt (dann klppt das mit dem Löschen)
eine Kopie des Blatts in einer neuen Mappe erstellt (dann geht das Löschen etwas schneller)

Wenn mir jemand sagen kann, wie ich diese Ausmaße auf 300 KB schrumpfen kann, ohne die vermeintliche Fehlerquelle zu entfernen, mache ich das gerne und lade dann auch gerne eine Bsp Datei hoch.

hier das Makro:

Sub BereinigeCodesBlatt()

Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim rngKeep As Range
Dim shp As Shape
Dim cmt As Comment
Dim area As Range

    Set ws = ThisWorkbook.Sheets("Codes")


' --- Bereiche, die behalten werden ---
Set rngKeep = Union(ws.Range("A1:I88326"), ws.Range("K1:K2"))

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

' --- 1. Inhalte und Formate außerhalb der behaltenen Bereiche löschen ---
ws.Cells.ClearFormats
ws.Cells.ClearContents

' Inhalte/Formate in den behaltenen Bereichen wiederherstellen
For Each area In rngKeep.Areas
area.Value = area.Value
area.NumberFormat = "General"
Next area

' --- 2. Objekte (Shapes, Textfelder, Bilder) außerhalb des behaltenen Bereichs löschen ---
For Each shp In ws.Shapes
If Intersect(shp.TopLeftCell, rngKeep) Is Nothing Then
shp.Delete
End If
Next shp

' --- 3. Kommentare/Notizen außerhalb des behaltenen Bereichs löschen ---
For Each cmt In ws.Comments
If Intersect(cmt.Parent, rngKeep) Is Nothing Then
cmt.Delete
End If
Next cmt

' --- 4. Alte Zeilen/Spalten außerhalb löschen ---
On Error Resume Next
lastRow = ws.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
lastCol = ws.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
On Error GoTo 0

If lastRow > 88326 Then ws.Rows("88327:" & lastRow).Delete
If lastCol > 11 Then ws.Columns("L:" & ws.Columns(lastCol).Address(False, False)).Delete

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

MsgBox "Bereinigung abgeschlossen!", vbInformation
End Sub


Anzeige

37
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 10:59:04
Piet
Hallo

wie gross ist die Datei denn? Könnte man sie als ZIP verpacken?
Was ist, wenn du das Blatt in eine neue Datei als Werte kopierst und dort neu formatierst?

Meine Methode ist, in solchen Fällen eine Kopie machen, in der Kopie Spalten löschen, speichern, Datei schliessen und Neu Öffnen um zu sehen, ob der Fehler noch vorhanden ist. So kann man ggf. den Bereich wo man gezielt suchen muss eingrenzen.
Auch mal mit MsgBox testen ob noch versteckte Objekte im Sheet sind. Verwende dazu mal diesen Befehl:
MsgBox ActiveSheet.DrawingObjects.Count --> Drawing Objects war vor Shapes die alte Programmierung!
Damit findet man manchmal Objekte die Shapes nicht erfaßt hat. Warum auch immer ...

Fehler in deinem LöschCode: - damit löschst du alle Formate und alle Werte im ganzen Blatt!
Danach kannst du auch mit der For Next Schleife keine Datem mehr wiederherstellen!
ws.Cells.ClearFormats
ws.Cells.ClearContents
Zum löschen überflüssiger Spalten und Zeilen reicht der 4. Teil in deinem Löschmakro

mfg Piet

Sub test()

MsgBox ActiveWorkbook.Names.Count
MsgBox ActiveSheet.DrawingObjects.Count
MsgBox ActiveSheet.Hyperlinks.Count
MsgBox ActiveSheet.Comments.Count
On Error Resume Next
Zahl = Cells.SpecialCells(xlCellTypeFormulas).Count
MsgBox Zahl
End Sub
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:16:31
Christian
Hallo Piet, also erstmal danke für deine Antwort.

Selbst wenn ich nur das Blatt Codes nehme und es mit Winrar und höchster Kompression packe, sind es immer noch 7,6 MB statt 8,7.

Aber dein Rat, mal in eine neue Mappe nur die Werte einzufügen und danach die Formatierungen wiederherzustellen, hat zum Erfolg geführt.
Bin dann hingegangen und habe den Bereich A1:K88326 kopiert und ebenfalls die Werte eingefügt und siehe da, das Problem hat sich gelöst.
Aber als ich dann die Formel in Spalte F wieder eingefügt habe, ging das Problem wieder von vorn los. Es liegt also wohl an dieser Formel.

Hast du da eine Idee?

Danke
Christian


Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 11:36:23
Onur
Poste mal eine Version mit 100 Zeilen - den Rest kann ich mir selber runterkopieren.
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:49:26
Daniel
Hi
Beim Löschen von Zeilen prüft Excel alle vorhandenen Formeln, ob die verwendeten Zellbereiche von der Löschung betroffen sind und passt ggf die Formeltexte an.
Das kann man auch nicht abschalten.


Gruß Daniel
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:57:35
Christian
Hallo Daniel,

danke für die Erklärung.
Ich hoffe ja dass Onur eine Lösung findet, die schneller rechnet als die bisherige Formel.

Gruß
Christian
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 13:23:42
Daniel
Probier mal, ob du nicht die Geburtsdaten in eine andere Spalte (ggf auf einem anderen Tabellenblatt) extrahiert und dabei sortierst (Funktion Sortieren)
Dann kannst du mir dem XVergleich (Variante für Sortierte Daten) in dieser Liste ebenfalls den Rang ermitteln.
Ob es aber wirklich schneller ist, musst du ausprobieren .

Gruß Daniel
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 13:49:14
Christian
Hallo Daniel,

jetzt stehe ich vor einem Problem bei dem ich nicht mehr weiterweiß.

Ich bin hingegangen und habe ein Blatt Geburtstage erstellt, in Spalte A die Formel

=SORTIEREN(FILTER(Codes!E$1:INDEX(Codes!E:E;Codes!$K$1);Codes!E$1:INDEX(Codes!E:E;Codes!$K$1)>"");1;-1)


und dann in Codes!M die Formel

=WENN(E1="";"";AUFRUNDEN(XVERGLEICH(E1;Geburtstage!A$1:INDEX(Geburtstage!A:A;$K$2);;-1)/$K$2;2))


habe diese Ergebnisse dann aber mit der nach wie vor bestehenden Formel
=WENN(E1>"";AUFRUNDEN(RANG.GLEICH(E1;E$1:INDEX(E:E;$K$1);0)/$K$2;2);"").
verglichen.

Bei 243 der 11741 Daten ist die ausgegebene Prozentzahl nicht identisch, kann es sein, dass meine Ursprungsformel jedem identischen Datum denselben Rang und damit auch die selbe Prozentzahl zuweist und die anderen beiden Formeln jeder Zahl einen eigenen Rang zuweist, auch wenn sie identisch sind?

Da weiß ich nicht mehr weiter.

Gruß
Christian

Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 14:30:50
Christian
Hallo Onur, das ist leider nicht dasselbe Ergebnis, berechne in deiner Mappe mal in K2
=ANZAHL2(E:E)
und dann in Spalte G meine ursprüngliche Formel
=WENN(E1>"";AUFRUNDEN(RANG.GLEICH(E1;E$1:INDEX(E:E;$K$1);0)/$K$2;2);"")
dann siehst du was ich meine, ich vermute der Unterschied liegt darin, dass du in Tabelle1!A die Eindeutig Formel nutzt, die Duplikate aber von mir gewollt waren.
Wenn ich aber die Eindeutig Formel aus deiner Formel rausnehme, also nur noch
=LET(dat;SORTIEREN(FILTER('Codes (2)'!E:E;'Codes (2)'!E:E>"");;-1);dat)
nutze, steht da bei mir überall nur noch das jüngste Datum
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 16:01:33
Daniel
Hi

Prinzipiell sollten Rang und XVergleich die selben Resultate liefern (passende Sortierung vorausgesetzt)

Allerdings kannst du beim XVergleich über die Parameter auswählen, ob dir bei Mehrfach vorkommenden Werten die Position des ersten oder die Position des letzten Wertes ausgegeben wird, dh diese Einstellung müsstest du dann passend wählen, um das gleiche Ergebnis zu erhalten wie mit Rang.

Es ist hier auch immer hilfreich, nicht sofort die ganze Formel einzusetzen, sondern erstmal die Kernfunktionen (Rang/Vergleich) und schauen, dass du mit diesen gleiche Ergebnisse erzielst.


Noch ein Tipp
Du verwendest häufig die Index-Funktion mit Anzahl2, um einen Zellbezug nur auf einen kleineren, aber verändetlichen Zellbereich zu beziehen.
Dass ist in Excel 365 nicht mehr notwendig, hier gibt es andere Funktionalitäten, die das einfacher und wahrscheinlich schneller machen.

Beidespiel 1:
Du willst für den Vergleich/Rang auf die Zellen Referenzieren, die Sortierformel als Spillformel ausgibt.
Hier reicht es aus, wenn man den Zellbezug auf die erste Zelle setzt (die mit der Formel) und ein # anhängt: Tabelle1!A1#
Dann geht der Bezug automatisch auf alle Zellen, die von dieser Formel belegt werden.

Beidspiel 2
Du referenziertin einer Spalte von der ersten bis zur letzten Zeile. Mit dem Bezug: A.:.A geht dieser jetzt nicht mehr auf die ganze Spalte A, sondern nur auf den Bereich, der tatsächlich belegt ist. Damit brauchst du dann das Index und das Anzahl2 nicht mehr.
Wenn du hier Überschrift ausblenden willst, geht das auch, aber du musst Start- und Endzeile angeben:
A2.:.A999999

Funktioniert aber genauso, du musst dich jetzt nicht mehr um die Datenmenge kümmern.

Gruß Daniel
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 16:28:10
Christian
Hallo Daniel

Zitat:
Allerdings kannst du beim XVergleich über die Parameter auswählen, ob dir bei Mehrfach vorkommenden Werten die Position des ersten oder die Position des letzten Wertes ausgegeben wird, dh diese Einstellung müsstest du dann passend wählen, um das gleiche Ergebnis zu erhalten wie mit Rang.

Ok, das könnte dann die Erklärung für die Differenzen zwischen meiner und Onur's Formel sein.

Das mit der Index Funktion hatte ich eigentlich ursprünglich gar nicht in der Tabelle, das war mein erster Versuch die Rechenzeit der Formeln einzudämmen, als ich gemerkt hatte wie schleppend es mit dem Zeilen löschen vorangeht. Vorher stand da D:D und E:E als Bezug.

Aber auf jeden Fall danke für deine Erklärungen. Ich schätze das muss ich mir mal genauer anschauen mit den neuen Zellbezügen.

Die Tabelle steckt in ihren Ursprüngen noch im Jahr 2012 also lange bevor es Powerquery gab. Das ein oder andere hab ich inzwischen mit PQ gelöst, aber wir reden jetzt von 30 Blättern, 10 normalen Makros (teilweise über 1000 Zeilen), 2 Worksheet Change Makros, 3 PQ Abfragen, aber jetzt dank Case restlos keine Formeln mehr. Insgesamt 29 MB. Das alles auf neuere Techniken wie PQ umzuwandeln wird glaub ich ein Fass ohne Boden, wobei die Makros sicher zu mindestens 90% aus Dingen bestehen, die man auch ohne Makros machen könnte, Makros haben halt den tollen Vorteil, man startet sie einmal und dann läuft alles automatisch.

Gruß
Christian
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 16:53:31
Daniel
Ganze Spalten als Bezug müssen nicht immer problematisch sein.
Problematisch werden sie als Teil einer Matrixformel mit zusätzlichen Berechnungen.
In einfachen Auswertungen (SummeWenns u.ä., SVerweis) erhöhen sie die Rechenzeit normalerweise nicht.
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 17:54:56
Christian
Da gebe ich dir recht, vielleicht täusche ich mich ja auch, aber bei der Rang Formel hab ich das schon kritischer gesehen, ob ich einen Bereich von 1,05 Mio oder 16000 Zellen habe. Einen Versuch war es mir jeden Fall Wert, ob es das Problem mit der Löschzeit behebt.

Gruß
Christian
Anzeige
Frage nicht mehr offen owT
08.01.2026 16:28:49
Christian
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 14:38:15
Onur
HÄÄÄHH??
DU hast doch geschrieben:
"Stell dir einfach vor du hast 300 Personen, die jüngsten 3 (1%) tust du in eine Gruppe die du 1% nennst, die nächst jüngeren 3 dann in eine Gruppe die du 2% nennst, die nächstjüngeren 3 dann in eine Gruppe die du 3% nennst usw.
Und zusätzlich die Vorraussetzung, dass Leute mit demselben Geburtstag in derselben Gruppe landen, auch wenn das bedeutet dass nicht jede Gruppe gleich groß ist."

Und genau das tut meine Formel! Egal wie oft ein Geburtstag vorkommt - ALLE mit dem selben Geburtstag bekommen die gleiche Prozentzahl.
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 15:29:46
Christian
Hallo Onur,

wie ich ja geschrieben habe, das war nur eine Vermutung, dass das der Grund ist, weshalb deine und meine Formel unterschiedliche Ergebnisse geliefert hatten.
Wenn du sagst, dass deine Formel gleiche Geburtstage berücksichtigt, tut es mir leid, dann lag ich mit dieser Vermutung falsch.
Aber einen Grund muss es ja für die Unterschiede geben:

Deine Formel in Spalte F, meine in Spalte G.

https://www.herber.de/bbs/user/179986.xlsx
Aber zur Info, inzwischen habe ich von Case eine funktonierende Lösung.

Gruß
Christian
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:18:51
Christian
Hallo Onur, danke für deine Hilfe,

habe mit Piets Ratschlägen feststellen können, dass die Formel =WENN(E1>"";AUFRUNDEN(RANG.GLEICH(E1;E$1:INDEX(E:E;$K$1);0)/$K$2;2);"") die Ursache ist, füge ich statt dieser die Werte ein, lassen sich Zeilen problemlos löschen.
Brauchst du die Bsp Datei trotzdem oder hast du auch so schon einen Tipp was ich tun kann?

Danke
Christian
Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:27:23
Onur
Das hatte ich mir auch schon gedacht (vor allem RANG), aber ich wollte nicht wild herumraten. Poste die Datei (mit Erklärung, wozu genau diese Formel dient), und ich schaue mal, wie man die Formel ersetzen kann.
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:40:23
Christian
Hallo Onur,

das war auch meine allerste Vermutung, was für mich dagegen sprach, dass m.E. ja auch eine Änderung an Spalte E eine Neuberechnung auslöst und die dann ja auch zumindest länger als gewöhnlich dauern sollte, was aber nicht der Fall ist.

https://www.herber.de/bbs/user/179980.xlsx

Aber wenn wir uns darauf einigen, dass es am wahrscheinlichsten an dieser Formel liegt, müsste dieses ja als Beispiel ausreichen.
Mir geht es darum, dass neben jüngsten 1% der Daten 1% steht, neben den nächstälteren 1% dann 2% steht, neben den nächstälteren 1% dann 3% usw. bis dann zum Schluss neben den ältesten 1% dann 100% steht.

Eine Lösung, die eine Sortierung nach Spalte E vorraussetzt, macht für mich nur sinn, wenn sich die Tabelle automatisch bei Eingabe in Spalte E sortiert. Aber solange sie das tut, wäre das kein Problem. Nur bei einer Sortierautomatik bedenken, dass die Originaltabelle von Spalte A bis I reicht. Aber eine vorgeschriebene Reihenfolge, die eingehalten werden muss haben die Zeilen nicht.

Danke und Gruß
Christian

Anzeige
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:49:28
Onur
Du hast aber immer noch nicht verraten, was die Formel genau berechnen soll.
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 12:56:20
Christian
Hallo Onur,

ich schrieb: Mir geht es darum, dass neben jüngsten 1% der Daten 1% steht, neben den nächstälteren 1% dann 2% steht, neben den nächstälteren 1% dann 3% usw. bis dann zum Schluss neben den ältesten 1% dann 100% steht.

Stell dir einfach vor du hast 300 Personen, die jüngsten 3 (1%) tust du in eine Gruppe die du 1% nennst, die nächst jüngeren 3 dann in eine Gruppe die du 2% nennst, die nächstjüngeren 3 dann in eine Gruppe die du 3% nennst usw.
Und zusätzlich die Vorraussetzung, dass Leute mit demselben Geburtstag in derselben Gruppe landen, auch wenn das bedeutet dass nicht jede Gruppe gleich groß ist. (das war durch die Rang Formel garantiert, da sie identischen Geburtstagen einen identischen Rang gibt).

Das hatt eigentlich die Erklärung sein sollen.
Wenn da etwas unklar ist, frag bitte nach.

Gruß
Christian
Anzeige
wobei...
08.01.2026 12:49:13
Christian
ein Worksheet Change Makro, dass die Tabelle auf Eingabe in Spalte E hin sortiert, bekomme ich denke ich auch selber hin. Die eigentliche Hilfe brauche ich bei der Formel..
AW: warum dauert Zeilen löschen 10 Sek.?
08.01.2026 13:50:36
Uduuh
Hallo,
mit Hilfsspalten z.B.
H1: =SORTIEREN(EINDEUTIG(FILTER(E:E;E:E>"")))
I1: =AUFRUNDEN(RANG.GLEICH(H1#;H:H;)/ANZAHL(H:H);2)

F1:Fxxxx: =WENNFEHLER(SVERWEIS(E1;H:I;2;);"")

Ist erheblich schneller.

Gruß aus'm Pott
Udo
Anzeige
AW: Hatte sich das nicht...
08.01.2026 13:30:34
Christian
in der Theorie war es das damals, ja, nur manchmal ändert es sich dann im Alltag leider nochmal....

ich hab es jetzt mal hiermit probiert, das bringt zwar die Ergebnisse die auch meine Ursprungsformel bringt, aber dauert erheblich länger als diese.

Private Sub Worksheet_Change(ByVal Target As Range)


If Target.Column > 5 Or Target.Cells.CountLarge > 1 Then Exit Sub

Dim lastRow As Long
lastRow = Target.Row

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim rngE As Range, rngF As Range
Set rngE = Me.Range("E1:E" & lastRow)
Set rngF = Me.Range("F1:F" & lastRow)

' Formel als Array über Evaluate berechnen
rngF.Value = Evaluate( _
"IF(" & rngE.Address & ">""""," & _
"ROUNDUP(RANK.EQ(" & rngE.Address & "," & _
"E$1:INDEX(E:E,$K$1),0)/$K$2,2),"""")")

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
Anzeige
Aber da hatte ich...
08.01.2026 13:47:30
Case
Moin Christian, :-)

... eine ZIP-Datei mit knapp 100.000 Datensätzen hochgeladen - da ging das in 1 Sekunde (also auf meiner Möhre).

Hier nochmal in deiner Beispieldatei: ;-)
https://www.herber.de/bbs/user/179984.xlsb

Mache in Spalte E einen Dopplelklick und dann Return - wird im Moment in Spalte H ausgegeben. ;-)

Servus
Case
Anzeige
AW: Aber da hatte ich...
08.01.2026 14:35:58
Christian
Hallo Daniel,

ich muss mich jetzt noch intensiver beschäftigen, was da genau passiert und wie ich das dann in meine Originaldatei übertragen und getestet bekomme, aber soviel kann ich schonmal sagen, dass es dieselben Ergebnisse wie meine Ursprungsformel ausgibt.

Danke
Christian
Anzeige
Testergebnis - sehr umständlich, aber Problem ist gelöst
08.01.2026 15:20:37
Christian
Hallo Case,

sorry nochmal für die Namensverwechslung gerade.

Also prinzipiell hat dein Makro funktioniert, ich habe trotzdem noch ein paar Sachen geändert.

1. noch mehr deaktiviert, nicht weil es notwendig war, sondern um eine einheitliche Struktur mit den anderen Makros in der Mappe zu haben.
2. Ausgabe in Spalte F statt H
3. Variablen einen für mich nachvollziehbaren Namen gegeben.
4. Den Code und das Worksheet Change Event zusammengefasst (aus demselben Grund, Vereinheitlichung mit den anderen Makros).

Dann habe ich leider festgestellt, dass das Zeilen löschen immer noch sehr lange dauert, also hab ich mich mal noch der anderen Formel in Spalte H gewidmet, diese durch Werte ersetzt und siehe da dann war Löschen just in Time möglich.
Dann hab ich mir überlegt, wie ich das Problem löse und hab mir gedacht, warum dann nicht noch ein zweites Worksheet Change, dass auf Eingabe in Spalte D reagiert und in derselben zeile Spalte H berechnet.
Und raus kam dann dieses Makro, was alle meine Tests bestanden hat und zulässt dass Zeilen in 0, nichts gelöscht werden. Vielen Dank für eure Unterstützung
Christian
Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zeile As Long
Dim AnzahlGueltigerDaten As Long
Dim Ausgabearray() As Variant
Dim DatumArray() As Double
Dim Eingabearray As Variant
Dim RangDict As Object
Dim LetztesDatum As Double
Dim DatumSchluessel As String
Dim GesamtZeilen As Long
Dim AktuelleZeile As Long

' --- Alles deaktivieren für Performance ---
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
.DisplayAlerts = False
End With

On Error GoTo Cleanup ' sicherstellen, dass alles wieder eingeschaltet wird

' --- Abschnitt für Spalte E (Datumsrangberechnung) ---
If Not Intersect(Target, Me.Columns("E")) Is Nothing Then
' Alle Werte aus Spalte E bis letzte gefüllte Zeile einlesen
Eingabearray = Me.Range("E1:E" & Me.Cells(Me.Rows.Count, 5).End(xlUp).Row).Value
GesamtZeilen = UBound(Eingabearray, 1)

' Nur gültige Datumswerte in ein Array übernehmen
AnzahlGueltigerDaten = 0
For AktuelleZeile = 1 To GesamtZeilen
If IsDate(Eingabearray(AktuelleZeile, 1)) Then
AnzahlGueltigerDaten = AnzahlGueltigerDaten + 1
ReDim Preserve DatumArray(1 To AnzahlGueltigerDaten)
DatumArray(AnzahlGueltigerDaten) = CDbl(Eingabearray(AktuelleZeile, 1))
End If
Next AktuelleZeile

' Wenn keine Datumswerte vorhanden, überspringen
If AnzahlGueltigerDaten > 0 Then
' QuickSort, absteigend (jüngste zuerst)
QuickSortDatum DatumArray, 1, AnzahlGueltigerDaten

' Dictionary zur Speicherung von Datum -> Rang
Set RangDict = CreateObject("Scripting.Dictionary")

Dim RangZaehler As Long
RangZaehler = 1

For AktuelleZeile = 1 To AnzahlGueltigerDaten
If AktuelleZeile = 1 Or DatumArray(AktuelleZeile) > LetztesDatum Then
RangZaehler = AktuelleZeile
End If
If Not RangDict.Exists(CStr(DatumArray(AktuelleZeile))) Then
RangDict.Add CStr(DatumArray(AktuelleZeile)), RangZaehler
End If
LetztesDatum = DatumArray(AktuelleZeile)
Next AktuelleZeile

' Ausgabearray für Spalte F vorbereiten
ReDim Ausgabearray(1 To GesamtZeilen, 1 To 1)

For AktuelleZeile = 1 To GesamtZeilen
If IsDate(Eingabearray(AktuelleZeile, 1)) Then
DatumSchluessel = CStr(CDbl(Eingabearray(AktuelleZeile, 1)))
Ausgabearray(AktuelleZeile, 1) = WorksheetFunction.RoundUp(RangDict(DatumSchluessel) / AnzahlGueltigerDaten, 2)
Else
Ausgabearray(AktuelleZeile, 1) = ""
End If
Next AktuelleZeile

' Ergebnis in Spalte F schreiben und formatieren
Me.Range("F1").Resize(GesamtZeilen, 1).Value = Ausgabearray
Me.Range("F1").Resize(GesamtZeilen, 1).NumberFormat = "0%"
End If
End If

' --- Abschnitt für Spalte D (URL einfügen in Spalte H) ---
If Not Intersect(Target, Me.Columns("D")) Is Nothing Then
Dim Zelle As Range
For Each Zelle In Intersect(Target, Me.Columns("D"))
If Zelle.Value > "" Then
' URL zusammensetzen
Me.Cells(Zelle.Row, "H").Value = "http://web.archive.org/web/20220630000000/https://www.imdb.com/name/" & Zelle.Value & "/"
Else
Me.Cells(Zelle.Row, "H").ClearContents
End If
Next Zelle
End If

Cleanup:
' --- Alles wieder einschalten ---
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.DisplayAlerts = True
End With
End Sub

'------------------------------
' QuickSort für Double-Array (absteigend)
Private Sub QuickSortDatum(ByRef arr() As Double, ByVal IndexUnten As Long, ByVal IndexOben As Long)
Dim PivotWert As Double
Dim TempWert As Double
Dim Links As Long
Dim Rechts As Long

Links = IndexUnten
Rechts = IndexOben
PivotWert = arr((IndexUnten + IndexOben) \ 2)

Do While Links = Rechts
Do While arr(Links) > PivotWert
Links = Links + 1
Loop
Do While arr(Rechts) PivotWert
Rechts = Rechts - 1
Loop
If Links = Rechts Then
TempWert = arr(Links)
arr(Links) = arr(Rechts)
arr(Rechts) = TempWert
Links = Links + 1
Rechts = Rechts - 1
End If
Loop

If IndexUnten Rechts Then QuickSortDatum arr, IndexUnten, Rechts
If Links IndexOben Then QuickSortDatum arr, Links, IndexOben
End Sub


Anzeige
sorry meinte natürlich Case... owT
08.01.2026 14:36:30
Christian
Verständnisfrage...
08.01.2026 14:44:55
Christian
ich verstehe richtig, das Makro

liest alle Datumswerte aus Spalte E in ein Array.
Filtert nur echte Datumswerte.
Sortiert diese Werte absteigend (jüngste zuerst) mit einem QuickSort
Vergibt Ränge, wobei gleiche Daten denselben Rang bekommen.
Rechnet daraus Prozentwerte (0–100 %).
Schreibt die Werte zurück in Spalte H und formatiert sie als Prozent.

Mache mich dann jetzt nachdem ich hoffe ich es verstanden hab ans Einbauen in die Originaldatei. Bitte um kurze Rückmeldung ob ichs richtig verstanden habe.

Danke
Christian
Anzeige
Zunächst ist...
08.01.2026 16:32:42
Case
Moin Christian, :-)

... QuickSort nur ein Sortier-Algorithmus. Auf- oder Absteigend bestimmst du. ;-)

Schau dir - wenn du sowas wissen möchtest - immer das Lokal-Fenster (mit Haltepunkten F9) an. ;-)

Vor QuickSort:
Userbild

Nach QuickSort:
Userbild

Prinzipiell könnte man den Code noch verschlanken. Habe nur keine Lust mehr dazu. Mache fast nichts mehr in VBA. Habe aber einen sehr großen Fundus in meinen MZ-Tools abgelegt. Da kopiere ich dann einfach raus. Was du mit dem Code machst ist deine Sache. ;-)

Servus
Case
Anzeige
AW: Zunächst ist...
08.01.2026 16:42:57
Christian
Hallo Case,

danke nochmal für die Erklärung

wie ich vorhin schon Daniel schrieb

Die Tabelle steckt in ihren Ursprüngen noch im Jahr 2012 also lange bevor es Powerquery gab. Das ein oder andere hab ich inzwischen mit PQ gelöst, aber wir reden jetzt von 30 Blättern, 10 normalen Makros (teilweise über 1000 Zeilen), 2 Worksheet Change Makros, 3 PQ Abfragen, aber jetzt dank Case restlos keine Formeln mehr. Insgesamt 29 MB. Das alles auf neuere Techniken wie PQ umzuwandeln wird glaub ich ein Fass ohne Boden, wobei die Makros sicher zu mindestens 90% aus Dingen bestehen, die man auch ohne Makros machen könnte, Makros haben halt den tollen Vorteil, man startet sie einmal und dann läuft alles automatisch.

Aber es gibt auch Dinge, die kann man m.E. nicht mit PQ machen, wie z.b. sämtliche Hyperlinks die sich auf einer Internetseite befinden, auflisten, temporär Kopien von Blättern erstellen und wieder löschen, Formatierungen wie kursiv, Schriftgröße 11 anwenden, damit Inhalte, die aus dem Internet kopiert wurden, vereinheitlicht werden (kopiert von Seiten wie IMDB, die leider Skripte, die auf sie zugreifen blocken). Das sind Dinge, da werde ich wohl kurzfristig nicht auf VBA verzichten können, sollte ich sie automatisiert lassen können.

Außerdem hat PQ m.e. den Nachteil, du kannst nur ganze Spalten ändern, wenn man nur einzelne Zeilen ändern will wird das zumindest äußerst umständlich.

PQ hab ich eigentlich nur da im Einsatz, wo es darum geht, CSV Dateien so aufzubereiten, dass sie nur noch das beinhalten was ich brauche und das auch in einer für mich akzeptablen Form.

Ich hab halt manchmal Punkte über die 13 Jahre, wo ich manchmal denke, das möchte ich ändern, vieles bekomme ich selber hin, manchmal brauche ich eure Hilfe, für die ich sehr dankbar bin.

Gruß
Christian
Anzeige
Das kenne ich...
08.01.2026 17:29:58
Case
Moin Christian, :-)

... von früher gut. ;-)

Solche gewachsenen Projekte kann man nicht einfach "umstellen". Und ja - PQ hat Grenzen. ;-)
Man muss in Excel einfach aus allen Welten (VBA, PQ, Formeln, Pivot, Office-Script, Python...) das Bequemste nehmen - vorrausgesetzt man kennst sich in Allen aus. ;-)

Häufig hört man: "Ich kenne mich in Power Query nicht aus - habe ich heute zum ersten Mal gesehen! Da nehme ich lieber VBA!". Allerdings sagen sie dann, dass sie sich in VBA nur rudimentär auskennen. Herrlich. ;-)

Wobei in großen Projekten IMHO am ehesten Formeln und Bedingte Formatierungen Probleme bereiten. ;-)

Für mich ist das - seit ich in Rente bin - alles ein großer Spaß und ein gutes Gehirnjogging. ;-)

Servus
Case
Anzeige
AW: Das kenne ich...
08.01.2026 17:52:57
Christian
Hallo Case,

das waren ja jetzt auch nur Beispiele, ich bezweifele z.b. auch dass Powerquery die Quelldateien umbenennen und verschieben kann (auch das z.b. machen meine Makros) oder Bilder mit ImageMagick bearbeiten, um noch einen Fall zu nennen, wo ich VBA einsetze. In dem Fall Excel weil ich da 2 Spalten machen kann alter Name, neuer Name z.B.

Aber es gibt auch Dateien, wo ich ausschließlich mit PQ arbeite, z.b. hab ich eine CSV Datei mit allen Haltestellen in Deutschland, (inkl. Koordinaten) wenn es da z.b. um Entfernungsberechnungen geht, da sag ich mir, warum Formeln oder VBA, das kann PQ auch, wenn es schon sowieso um eine CSV Datei geht.

Mir ist von euch schon öfter geraten worden, wenn ich Fragen zu meinen alten Konstrukten hatte, das mal zu "modernisieren". Ich selber habe dann von mir aus schon immer gesagt, dass ich aufgrund des Umfangs davon Abstand nehme, die Hilfe, die ich da bräuchte, würde bei weitem das angemessene Maß an dieses Forum übersteigen und für eine Auftragspogrammierung zahlen, die mir keinen Mehrwert bringt, da das alte System ja funktioniert, sehe ich irgendwo auch nicht ein.

Gruß
Christian
Anzeige
Case, ich weiß du wirst mich jetzt lynchen
08.01.2026 18:21:08
Christian
aber an eine Sache habe ich nicht gedacht,

eins der 10 Makros, genau genommen das dritte holt sich aktuelle Geburtsdaten aus ner CSV Datei und berechnet dann die Prozentzahlen neu, bislang auf diesem Weg

  ' -------------------------

' 3. Geburtstage Codes mit Leute abgleichen
' -------------------------
lastLeute = wsLeute.Cells(wsLeute.Rows.count, "B").End(xlUp).Row
lastCodes = wsCodes.Cells(wsCodes.Rows.count, "D").End(xlUp).Row

If lastLeute >= 2 Then
arrLeute = wsLeute.Range("B2:D" & lastLeute).Value
Else
ReDim arrLeute(1 To 1, 1 To 3): arrLeute(1, 1) = "": arrLeute(1, 2) = "": arrLeute(1, 3) = ""
End If
If lastCodes >= 2 Then
arrCodes = wsCodes.Range("D2:E" & lastCodes).Value
Else
ReDim arrCodes(1 To 1, 1 To 2): arrCodes(1, 1) = "": arrCodes(1, 2) = ""
End If

Set dictLeute = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arrLeute, 1)
nameKey = arrLeute(i, 1)
dictLeute(nameKey) = arrLeute(i, 3) ' datumsfeld C -> index 3
Next i

Set dictCodesNames = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arrCodes, 1)
nameKey = arrCodes(i, 1)
If dictLeute.Exists(nameKey) Then
If IsDate(dictLeute(nameKey)) And Trim(dictLeute(nameKey)) > "" Then
arrCodes(i, 2) = dictLeute(nameKey)
End If
End If
Next i

' zurückschreiben (D2:E)
If lastCodes >= 2 Then wsCodes.Range("D2:E" & lastCodes).Value = arrCodes

' -------------------------
' 4. Bereich F berechnen (in Codes)
' -------------------------
If lastCodes >= 1 Then
wsCodes.Range("F1:F" & lastCodes).FormulaLocal = _
"=WENN(E1>"""";AUFRUNDEN(RANG.GLEICH(E1;E:E;0)/ANZAHL2(E:E);2);"""")"
wsCodes.Range("F1:F" & lastCodes).Calculate
End If


mit anderen Worten dieses Makro würde die durch dein Makro ersetzten Formeln wieder ins Blatt zurückschreiben. Was würdest du mir da raten?

Danke
Christian
Anzeige
Was würdest du mir da raten?
08.01.2026 18:29:33
Uduuh
Hallo,
lass Schritt 4 weg.

Gruß aus'm Pott
Udo
AW: Was würdest du mir da raten?
08.01.2026 18:45:47
Christian
ja nein, es soll ja an dieser Stelle berechnet werden, nur auf dem neuen Weg, da sich ja durch Punkt 3 die Daten in Spalte E ändern.

Habe jetzt den neuen Code in ein Modul gepackt und rufe dieses jetzt aus dem Worksheet Change als auch aus dem dritten Makro heraus auf.

Funktioniert soweit.

Gruß
Christian

Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige