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?
Vielen Dank fürs Gehirnschmalzanregen und Gruß
Hallo
Der einfachste Weg ist Bed. Format
Arbeitsblatt mit dem Namen 'Tabelle1' |
| E |
1 | Liste |
2 | Meier |
3 | Quappe |
4 | Nordmann |
5 | Eisfeld |
Zelle | bedingte Formatierung... | Format |
E2 | 1: =ZÄHLENWENN($A$2:$A$7;E2)=0 | abc |
Gruss Guschti
Hi Guschti,
den Tipp wollte ich eigentlich auch geben - dann hatte ich aber bemerkt, dass in der Beispieldatei ein wichtiger Zusatz drin steht: [
attachment=25357]
Damit entfällt das Einfache.
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
Gruß
Hallöchen,
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 ...
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
EDIT: @André: Zwei Dumme, ein Gedanke :100:
Hi Berni,
Zitat:@André: Zwei Dumme, ein Gedanke
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
PHP-Code:
Sub M_snb()
sn = ListObjects(1).DataBodyRange
sp = ListObjects(2).DataBodyRange
With CreateObject("scripting.dictionary")
For j = 1 To UBound(sn)
x0 = .Item(sn(j, 1))
Next
For j = 1 To UBound(sp)
If Not .exists(sp(j, 1)) Then sp(j, 1) = ""
Next
End With
ListObjects(2).DataBodyRange = sp
End Sub
oder
PHP-Code:
Sub M_snb()
[E2:E150] = [if(countif(A2:A150,E2:E150)=0,"",E2:E150)]
End Sub
SO viele super Tipps - die helfen mir erstmal weiter ... DANKE :)