13.07.2019, 12:29 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2019, 12:29 von EasY.)
Hi Leute,
ich benötige einen Tipp in Sachen VBA von euch. Das Topic ist ein wenig merkwürdig gewählt, mir fiel nur nichts besseres ein :).
Meine Prämisse ist Schnelligkeit vor Komfortfunktion, von daher suche ich ein schnelles Makro für folgendes Problem:
Ich habe eine Namensliste mit ca. 150 Namen - diese sind nicht sortiert. Weiterhin habe ich eine zweite Liste (ein kleiner Auszug dieser Namen), die ich mit den 150 Namen abgleichen möchte. Es kommt vor, dass in der Namensliste mal ein Name rausgelöscht wird. Nun soll auf Knopfdruck abgeglichen werden, ob noch alle Namen der zweiten Liste in der Namensliste vorhanden sind.
Eine for-next-Schleife mit Suche in der Namensliste für jeden einzelnen Namen dürfte viel zu langsam und rechenintensiv sein...fällt euch noch etwas besseres ein?
13.07.2019, 13:38 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2019, 13:38 von EasY.)
Ja genau, es soll im Hintergrund automatisch passieren ... der Code soll in einen bereits bestehenden Code eingebaut werden. Deswegen muss er auch flott sein :).
Habe auch schon daran gedacht, die Namensliste und die Liste die überprüft werden soll per makro untereinander zu kopieren und dann per makro die doppelten rauszulöschen ... wäre das flotter? Dann erkennt er zumindest die Namen, die nicht mehr in der Namensliste sind. Bin eher der Pragmatische :P ... vll geht es auch eleganter
Vielleicht übernimmt der TE das Löschen selbst und sucht, wie in der Aufgabenbeschreibung, nur nach der Methode der Erkennung :17: Vielleicht soll aber auch nur erkannt werden, das Nordmann rausgelöscht wurde und das ist verdrückt ausgekehrt ... :21: Dann entfällt das einfache nicht oder nur vielleicht :15:
Wenn es vor allem um eine schnellere Lösung als eine For - Next - Schleife geht, dann käme es darauf an, wo Deine For-Next-Schleife wirkt. Wenn Du das mit Zellbezug machst, ist das deutlich langsamer als wenn Du die Zellinhalte erst in ein Array holst - das geht in einem Rutsch (pro Array) - arrTempxxx = Range("A1:A1000").Value - und dann die Arrays z.B. mit For Next durchsuchst.
Eventuell ist statt der bedingten Formatierung auch eine zusätzliche Spalte interessant, wo Du z.B. mit ZÄHLENWENN feststellst, ob der Name noch vorhanden ist. Dann brauchst Du nur einen Autofilter zu setzen und hast ein Ergebnis. Könnte man auch programmieren ...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
13.07.2019, 13:47 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2019, 13:48 von MisterBurns.)
Zitat:Eine for-next-Schleife mit Suche in der Namensliste für jeden einzelnen Namen dürfte viel zu langsam und rechenintensiv sein
Hast du das denn getestet? Eine Schleife für 150 Namen dürfte in meinen Augen keine nennenswerte Zeit benötigen. Löschen per Schleife ist zwar grundsätzlich tatsächlich eine Schneckenlösung, allerdings ist ja davon auszugehen, dass nur wenige tatsächliche Löschvorgänge je Durchlauf stattfinden. In Kombination mit Application.Screenupdating = False wird auch das nicht ins Gewicht fallen.
Variante mit Schleife: Mach eine Hilfsspalte mit der von Guschti vorgeschlagenen Formel. Bei Codeausführung musst du nur die Hilfsspalte abgrasen lassen und die Einträge mit 0 rauschlöschen lassen Variante ohne Schleife: Hilfsspalte mit Formel wie zuvor erwähnt. Der Code setzt den Autofilter auf Einträge mit 0 und löscht alle Treffer in einem Rutsch
das ist dann Crossanswering :15: wenn zwei oder mehr Antworter überschneidend mit schreiben beginnen und dann peu a peu die Antworten erscheinen, ohne das die anderen das mitbekommen hatten :100: Ging mir mit der Antwort vom TE genau so, ansonsten hätte ich ein paar Vielleichts weniger erwähnt
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)