Microsoft Excel

Herbers Excel/VBA-Archiv

Update Usedrange nach .Removeduplicates

Betrifft: Update Usedrange nach .Removeduplicates von: Robert
Geschrieben am: 13.08.2014 11:51:54

Hallo zusammen,

Beim Verwenden einer Schleife über alle Zeilen einer Tabelle würde ich gerne zugunsten der Geschwindigkeit vorher alle Duplikate in Spalte 1 löschen.
Ich mache das mit der Funktion

Tabelle1.UsedRange.Removeduplicates 1, xlYes
Problem:
die Zeilen werden zwar gelöscht, aber die UsedRange ist noch unverändert wie vor dem löschen. Wie kann ich die Usedrange "Updaten", damit ich in meiner Schleife problemlos .Usedrange.Specialcells(xlCellTypeLastCell).Row referenzieren kann?

Viele Grüße
Robert

  

Betrifft: AW: Update Usedrange nach .Removeduplicates von: Daniel
Geschrieben am: 13.08.2014 12:15:11

Hi
probiere mal, ob es hilft die Datei zu speichern.
Dann müsste die UsedRange aktualisiert werden.
Excel verfährt bei der Usedrange bzw LastCell nach dem Motto, "lieber etwas zu gross als zu klein" und erkennt das Löschen oder Leeren von Zellen nicht sofort (hinzugefügte Zellen werden jedoch sofort berücksichtigt)

beim RemoveDuplicates muss man zudem beachten, das hierbei keinerlei Anpassungen von Zellbezügen in Formeln oder ähnlichem vorgenommen werden (so wie es beim Löschen von Zellen passiert).
Auf dieses Feature wurde wahrscheinlich bewusst verzichtet, um die hohe Verarbeitungsgeschwindigkeit auch mit grössten Datenmengen zu erreichen.

Gruß Daniel


  

Betrifft: AW: Update Usedrange nach .Removeduplicates von: Robert
Geschrieben am: 13.08.2014 13:26:51

Hallo Daniel,

Hmm, also Zellen löschen (.Delete) erzeugt ein sofortiges Update der UsedRange.
Das Problem ist, dass bei .RemoveDuplicates offenbar die Zellen nicht gelöscht werden!

Speichern bringt keine Besserung, Frage daher weiterhin offen!

Viele Grüße
Robert


  

Betrifft: AW: Update Usedrange nach .Removeduplicates von: Daniel
Geschrieben am: 13.08.2014 13:50:15

Hi
wie gesagt, RemoveDuplicates nimmt keine Anpassungen vor, sondern entfernt einfach nur die Inhalte.
das ist der Preis für die Geschwindigkeit.

dann musst du deine letzte befüllte Zeile anders ermitteln, bspw mit Cells(1, x).End(xlup).Row in einer Spalte, die auf jeden Fall befüllt ist.

oder du löschst die Duplikate mit Delete
das ist dann zwar etwas aufwendiger, aber wenn man es richtig macht auch nicht viel langsamer als das Removeduplikates

1. Sortiere die Daten nach der Kriteriumsspalte, so dass Duplikate direkt untereinander stehen
2. kennzeichne in einer Hilfsspalte per Formel alle Duplikate die gelöscht werden müssen mit 1 und alle die stehen bleiben sollen mit dem Blank "" Formel: =Wenn(A1=A2;1;"")
3. ersetze die Formel durch ihre Werte
4. sortiere die Liste nach der Hilfsspalte
5. wähle die Zeilen mit 1 (SpecialCells(xlcelltypeconstants, 1) und lösche diese mit .EntireRow.Delete

damit hast du das Delete das du brauchst und das ganze ist auch nicht viel langsamer als das RemoveDuplicates (im Sortieren ist Excel sehr schnell)

Gruß Daniel