HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Entdecke rund 2 Millionen Excel-Lösungen im
Forumsarchiv
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
10.05.2026 17:15:18
Testergebnis
Hallo Ralf,

nocmla vielen Dank. Hat ne ganze Weile gedauert, bis ich verstanden habe, was Sub Fill_It vor allem CHAR(RANDARRAY macht, bis ich rausgefunden habdass das 100000 zufällige Buchstaben von A bis D erzeugt.

Meine eigene Version, die ich gebaut hatte, war bereits von der Logik her ähnlich, aber deutlich umständlicher geschrieben.

Die aktuelle Version ist jetzt:

Option Explicit

Public Sub Makro9()


Dim ws As Worksheet
Dim lastRow As Long

Set ws = ActiveSheet

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

lastRow = ws.Cells(ws.Rows.count, "A").End(xlUp).row

If lastRow >= 2 Then

' Hilfsspalte
With ws.Range("E1:E" & lastRow)
.FormulaLocal = "=WENN(RECHTS(C1;3)=""jpg"";1/ZEILE();ZEILE())"
.Value = .Value
End With

' Sortierung für gewünschtes Behalten
With ws.Sort
.SortFields.Clear

.SortFields.Add ws.Range("B1:B" & lastRow), xlSortOnValues, xlAscending
.SortFields.Add ws.Range("C1:C" & lastRow), xlSortOnValues, xlAscending
.SortFields.Add ws.Range("E1:E" & lastRow), xlSortOnValues, xlDescending

.SetRange ws.Range("A1:E" & lastRow)
.Header = xlNo
.Apply
End With

' Duplikate entfernen
ws.Range("A1:E" & lastRow).RemoveDuplicates Columns:=Array(2, 3), Header:=xlNo

' Neue letzte Zeile
lastRow = ws.Cells(ws.Rows.count, "A").End(xlUp).row

' Optional zurücksortieren
With ws.Sort
.SortFields.Clear

.SortFields.Add ws.Range("D1:D" & lastRow), xlSortOnValues, xlAscending
.SortFields.Add ws.Range("C1:C" & lastRow), xlSortOnValues, xlAscending

.SetRange ws.Range("A1:E" & lastRow)
.Header = xlNo
.Apply
End With

' Hilfsspalte entfernen
ws.Columns("E").Delete

End If

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

End Sub
Als Antwort auf diesen Beitrag
RPP63
10.05.2026 10:00:12
Dauer
Moin!
Nö, ich werde nicht ausprobieren, wie lang eine rückwärtige Schleife mit Zellzugriff über 300K Zeilen nebst Löschungen benötigt.
Dürfte zig Minuten dauern …
Hingegen ist Daniels Methode mit Sortieren und Duplikate entfernen pfeilschnell!

Wir basteln uns mal eine Beispieldatei mit 100.000 Zeilen.
• Spalte A Buchstaben A-D
• Spalte B Buchstaben E-H mit den möglichen Endungen .jpg und .html
• Spalte C mit Daniels Formelvorschlag
• Dies ergibt 4*4 html-Unikate und 4*4 jpg-Unikate (also 32) auf 100.000 Zeilen.
Sub Fill_It()

Cells.Delete
Cells(1).Resize(, 3) = Array("Sp1", "Sp2", "Sp3")
Cells(2, 1).Formula2 = "=CHAR(RANDARRAY(100000,,65,68,1))"
Cells(2, 2).Formula2 = _
"=CHAR(RANDARRAY(100000,,69,72,1))&INDEX({"".html"","".jpg""},RANDARRAY(100000,,1,2,1))"
Cells(2, 3).Resize(100000).Formula = "=IF(RIGHT(B2,3)=""jpg"",ROW(),1/ROW())"
With Cells(1).CurrentRegion
.Copy
.PasteSpecial xlPasteValues
.HorizontalAlignment = xlCenter
.NumberFormat = "[<1]0.000;General"
.Columns.AutoFit
End With
Application.Goto Cells(1)
End Sub


Folgendes Makro behält die letzten jpg- und die ersten html-Unikate,
Dauer: < 0,4 Sekunden!
Sub letzte_Eindeutige_jpg_erste_eindeutige_html()

Dim Start#
Start = Timer
With Range("A1").CurrentRegion
.Sort .Cells(3), xlDescending, Header:=xlYes
.RemoveDuplicates Array(1, 2)
End With
With Range("A1").CurrentRegion
.Sort Range("B2"), , Range("A2"), Header:=xlYes
End With
Debug.Print Timer - Start
End Sub


Gruß Ralf
Folgenachrichten
Antwort auf Beitrag erstellen
Bitte einen Anwendernamen ohne @ eingeben.
Bitte das Passwort eingeben.
Bitte eine gültige E-Mail-Adresse eingeben.
Bitte einen Betreff eingeben.
Weitere Optionen
Aktivieren, wenn die Frage/der Beitrag noch nicht beantwortet wurde und unter Listen > Offene Threads erscheinen soll.
Beispieldatei hochladen

Bitte einen Nachrichtentext eingeben.