Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
956to960
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
956to960
956to960
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"

Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
03.03.2008 11:57:27
Andreas
Hallo liebes Herber- Forumsteam,
ich habe mich gerade an der Listenerstellung ohne Duplikate mittels VBA versucht. Bisher habe ich derartige Aufgaben immer über eine Formel von der excelformeln.de Webseite gelöst. Aber heute habe ich feststellen müssen, daß bei 1.500 zu prüfenden Zeilen die Performance dieser Array Formel nicht mehr annehmbar ist. Also machte ich mich auf die Suche nach einem passenden Code – nicht nur hier im Herber Forum. Ich habe keinen gefunden und es leider auch nicht geschafft, zum Teil sehr komplexe Codes, die mir begegneten umzuschreiben.
Eine Voraussetzung ist, daß die Filterung nicht auf Sheets mit fixen Bereichen referenzieren soll, sondern auf Ranges, die mit Namensdefinitionen arbeiten [Range(„Namensdef._1“)].
Ich habe den ersten Code mit dem Makro Rekorder generiert und auf meine Ranges angepaßt. Hat funktioniert. Aber: Wenn ein Code startet, der die Funktion „AdvancedFilter“ verwendet, werden die gesetzten (regulären) Filter im Tabellenblatt gelöscht. Sie müssen aber erhalten bleiben.
Außerdem hat sich im Laufe der letzten zwei Stunden gezeigt, daß leere Zellen in der Liste ohne Duplikate nicht auftauchen sollen. Und: Ich filtere ohne Duplikate in Spalte D, möchte jedoch die dazugehörigen Merkmale in Spalte A beim transferieren in den Zielbereich mitnehmen, ohne das in Spalte A irgend etwas gefiltert wird.
Dieses bringt für mich eine Komplexität mit sich, die ich nicht mehr lösen kann. Der einzige Filterweg ohne Duplikate für mich bisher war entweder die Formel oder AdvancedFilter. Beides scheidet aus. Einen Code umschreiben und auf Ranges münzen habe ich in unzähligen ruhigen Versuchen leider nicht hinbekommen. Ich wüsste auch nicht mal einen Ansatz, denn macht es Sinn, eine Schleife über einen Bereich von 1.500 Zeilen zu jagen? Ich vermute das die Performance dann auch nicht die beste ist.
Wißt ihr Rat? Über welchen Ansatz würdet ihr das realisieren?
Vielen Dank für Eure Hinweise und Kopfzerbrechen.
https://www.herber.de/bbs/user/50382.xls
Liebe Grüße, Andreas Hanisch

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
03.03.2008 12:39:00
ANdreas
Hallo Andreas,
ich würde immer den AdvancedFilter nehmen, einfach die Spalte vorher woanders kopieren (kurz leeres Blatt generieren, kopieren, filtern, zurückkopieren und das "leere" Blatt wieder löschen).
Gruß
Andreas

AW: Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
03.03.2008 12:58:00
Andreas
Hi Andreas,
der Advanced Filter ist der erste Gedanke. Aber dann sind alle gesetzten Filter weg. Die Datei ist eine Beispieldatei. Im "richtigen" Leben habe ich in den Ausgangsdaten zumeist diverse Filter gesetzt, die dann nicht weg sein dürfen, wenn der Advanced Filter aktiv war. Auch soll dieses Makro die Liste nach einem Ereignis generieren. On Sheet change oder nach Datei Öffnung. Das ist aber eine Feinheit, die ich realisiere, wenn das Filtermakro läuft. Also sind derartige manuelle Schritte nicht angebracht. Es soll unmerklich im Hintergrund geschehen.
Grüße, Andreas

Anzeige
AW: Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
03.03.2008 13:43:00
ANdreas
Hallo Andreas,
hier die langsame Version:

Sub SlowAdvancedFilter()
Dim lRow&, i&, nFilter&, s$
nFilter = 2
For i = 2 To ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
s = Cells(i, 4).Value
If Not s = "" And WorksheetFunction. _
CountIf(Range(Cells(2, 4), Cells(i, 4)), s) = 1 Then
Cells(nFilter, 10).Value = s
nFilter = nFilter + 1
End If
Next i
End Sub


Gruß
Andreas

AW: Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
04.03.2008 19:08:00
Andreas
Hallo Andreas,
ich habe Deinen Code ausprobiert und er funktioniert gut! Auch bei über 1.400 Zeilen finde ich das von der Zeit noch annehmbar. Vielen Dank an dieser Stelle.
Welche wäre denn die schnellere/ optimale Variante. Ich nehme an, daß was Du zuerst geantwortet hast?!
Ich habe nun jedoch ein anderes Problem: Ich arbeite in meinem Blatt mit Namensdefinitionen. Diese habe ich nun versucht in Deinen Code einzubauen. Das ist mir bis auf die Integration der Namensdefinitionen in „CountIf“ auch gelungen. Ich habe es in diversen Variationen probiert. Entweder kommt die Meldung „Erwartet Anweisungsende“ oder Listentrennzeichen oder Syntaxfehler. Ich habe es nie hinbekommen, den Range für CountIf seinerseits über Ranges zu definieren.
Weißt Du oder jemand anderes aus dem Forum woran das liegt? Was mache ich falsch in der Syntax?
Ich habe meine bisherigen Änderungen wieder als Datei angefügt. Modul2/ Sub SlowAdvancedFilter2()
https://www.herber.de/bbs/user/50433.xls
Vielen Dank für Deine/ Eure Rückmeldung.
Gruß, Andreas

Anzeige
AW: Ohne Duplikate per VBA m. Ranges u."Zellmitnahme"
05.03.2008 12:47:38
ANdreas
Hallo Andreas,
das Problem ist einfach, dass man bei Verwendung des Zeilenumbruchs mit _ im Code keinen Kommentar zwischen einbauen darf. Lösch einfach den auskommentierten Teil raus bzw. verschieb ihn, so das der Befehl nicht "unterbrochen" wird.
Gruß
Andreas

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige