Option Explicit Function SerpentSuche(rngSuche As Range, rngSuchFeld As Range) As String
Dim varSuche As Variant Dim varVergleich As Variant Dim strAusgabe As String Dim rngZelle As Range
strAusgabe = "" varSuche = Split(rngSuche)
For Each rngZelle In rngSuchFeld varVergleich = Split(rngZelle) If varVergleich(1) = varSuche(1) Then strAusgabe = strAusgabe & varVergleich(0) & " " End If Next rngZelle
SerpentSuche = strAusgabe End Function
und Beispiel:
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Zunächst mal großes Danke für deine erneuten Bemühungen! Gerne würde ich Dich jetzt in mein tägliches Abendgebet aufnehmen und Dich for ever lobpreisen! Würde man diese Beispieltabelle so stehen lassen, wärs perfekt. Das Probloem ist jetzt nur, dass wenn ich die Range in den beiden Spalten A und C erweitere und demzufolge auch die Spalte B, dann wird in der Ausgabe Spalte B nur noch #Wert ausgegeben und das bei jedem Vergleich. Die Formeln sind ja kopiersicher, also woran liegt das?
02.08.2016, 14:23 (Dieser Beitrag wurde zuletzt bearbeitet: 02.08.2016, 14:23 von Ego.)
Hallo Serpent ... ,
hast du die Bezüge nach der Erweiterung und vor dem kopieren "absolutiert" ?
hier ein Beispiel, dass auch mit leeren Zellen im Suchbereich erfolgreich ist. (Nur "If rngZelle <> "" Then...End If" eingefügt.)
Code:
Option Explicit Function SerpentSuche(rngSuche As Range, rngSuchFeld As Range) As String
Dim varSuche As Variant Dim varVergleich As Variant Dim strAusgabe As String Dim rngZelle As Range
strAusgabe = "" varSuche = Split(rngSuche)
For Each rngZelle In rngSuchFeld If rngZelle <> "" Then varVergleich = Split(rngZelle) If varVergleich(1) = varSuche(1) Then strAusgabe = strAusgabe & varVergleich(0) & " " End If End If Next rngZelle
SerpentSuche = strAusgabe End Function
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Es genügt schon, wenn ich die Spalte C mit meinem vollständigen Daten ersetze und dann die Range in der Zelle B2 dementsprechend erweitere. Im konkreten Fall auf =SerpentSuche(A2;$C$2:$C$160211), was dazu führt, dass nur noch #Wert ausgegeben wird, obgleich der entsprechende Wert mind. 3x vorhanden ist und es einen entsprechenden Vergleichswert in der Zelle A2 gibt.
02.08.2016, 15:03 (Dieser Beitrag wurde zuletzt bearbeitet: 02.08.2016, 15:05 von Ego.)
Hallo Serpent Driver,
hast du die Erweiterung der Funktion mit Berücksichtigung von leeren Zellen gelesen un d angepasst?
Wenn ja, könnte es sein dass ein Inhalt einer Zelle nicht dem Format -zwei Texte mit Leerzeichen getrennt- entspricht?
Hier nochmal eine Erweiterung des codes, der nicht nur leere Zellen, sondern auch Zellen ohne Trennung durch ein Leerzeichen, ignoriert. (eingefügt: If Ubound(varVergleich)>0 then....EndIf)
Code:
Option Explicit Function SerpentSuche(rngSuche As Range, rngSuchFeld As Range) As String
Dim varSuche As Variant Dim varVergleich As Variant Dim strAusgabe As String Dim rngZelle As Range
strAusgabe = "" varSuche = Split(rngSuche)
For Each rngZelle In rngSuchFeld If rngZelle <> "" Then varVergleich = Split(rngZelle) If UBound(varVergleich) > 0 Then If varVergleich(1) = varSuche(1) Then strAusgabe = strAusgabe & varVergleich(0) & " " End If End If End If Next rngZelle
SerpentSuche = strAusgabe End Function
Wichtig! Die Funktion liefert nur dann das richtige Ergebnis, wenn die Werte in Spalte A und C folgenden Aufbau haben:
ein Text(oder Ziffern ohne Leerzeichen) gefolgt von einem Leerzeichen gefolgt von einem Text(ohne Leerzeichen).
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
02.08.2016, 15:11 (Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2016, 12:53 von Rabe.
Bearbeitungsgrund: redundante Zeilenumbrüche entfernt
)
Hallo
ich habe mich bis jetzt nicht am Thread beteiligt, meine Beispieldatei könnte alle Ratgeber nachdenklich stimmen. Die neuste Datei mit einer VBA Lösung habe ich mir noch nicht angesehen, bin gespannt wie gut sie funktioniert.
Ich habe selbst ein Makro für Suchlauf entwickelt, und wurde beim Probelauf schnell ernüchtert. Für 3840 Daten brauchte das Programm vier Minuteni dann brach ich ab. Rechnet man es auf 67000 hoch heisst das 1 1/2 Std. Das sah ich nicht als praktikabel an. Ein wichtiges Problem war, das ich viele "doppelte Namen" vermutete.
So kam ich auf eine m.E. genial einfache Idee: den String einfach zerlegen und dann nach Text sortieren. Beim zweiten Durchlauf fand ich in 4 Minuten heraus das z.B. AUDIDORTMUND genau 150 mal vorkommt! Und nicht mit doppelten ID-Nummern. Es sind fast jedesmal andere ID Nummern.
Diese schlicht beweisbare Tatsache führt bei dieser Aufgabenstellung zu einem völlig neuen Denken. Ich ging bisher auch davon aus das es überwiegend eine zweite ID-Nummer gibt, die dann in Spalte B angezeigt werden soll. Das ist eine klare Aufgabenstellung.
Amüsante Frage: Wie stelle ich in Spalte B 150 verschiedene ID Nummern dar ???? Das ist Witzlos ... Hier mal mein vorlaufiges Ergebnis, nur zum zeigen das die Aufgabe schwieriger ist als gedacht:
3280 Daten geprüft in 4 Minuten Schaut man sich das Ergebnis an wurde bei 58% nichts gefunden 895 Mehrfach 27% Mehrfach Bei 27% der Daten gibt es mehrfache ID-Nummern, von 2-150 470 Einfach 14% Einfach Nur in 14% wurde eine zweite ID-Nummer gefunden, die in Spalte B 1910 No Find 58% No Find übernommen werden kann. Nach 4 Minuten hörte ich auf.
Schaut euch den zerlegten und Sortierten String einmal selnbst an. Jetzt kann man auch in VBA -ohne- Text vergleichen dirket nach dem vollen Namen suchen. Vorher musste ich auch per Makro zwischen Text: "AT", "ATS", "ATI", und Teilsstrings in anderen Namen unterscheiden. Das kostet Rechenzeit.
Vielleicht hift euch mein Gedanke die Sache auch mal so zu betrachten weiter.
hast du die Erweiterung der Funktion mit Berücksichtigung von leeren Zellen gelesen un d angepasst?
Wenn ja, könnte es sein dass ein Inhalt einer Zelle nicht dem Format -zwei Texte mit Leerzeichen getrennt- entspricht?
Hier nochmal eine Erweiterung des codes, der nicht nur leere Zellen, sondern auch Zellen ohne Trennung durch ein Leerzeichen, ignoriert. (eingefügt: If Ubound(varVergleich)>0 then....EndIf)
Code:
Option Explicit Function SerpentSuche(rngSuche As Range, rngSuchFeld As Range) As String
Dim varSuche As Variant Dim varVergleich As Variant Dim strAusgabe As String Dim rngZelle As Range
strAusgabe = "" varSuche = Split(rngSuche)
For Each rngZelle In rngSuchFeld If rngZelle <> "" Then varVergleich = Split(rngZelle) If UBound(varVergleich) > 0 Then If varVergleich(1) = varSuche(1) Then strAusgabe = strAusgabe & varVergleich(0) & " " End If End If End If Next rngZelle
SerpentSuche = strAusgabe End Function
Wichtig! Die Funktion liefert nur dann das richtige Ergebnis, wenn die Werte in Spalte A und C folgenden Aufbau haben:
ein Text(oder Ziffern ohne Leerzeichen) gefolgt von einem Leerzeichen gefolgt von einem Text(ohne Leerzeichen).
Ich habe dahingehend gar nichts angepasst und war eigentlich auch nicht nötig, weil ich die realen Daten in meiner Arbeitsmappe dem gleichen Muster angepasst habe mit denen auch Du gearbeitet hast. Der Textanteil besitzt in jedem Falle keine weiteren Leerzeichen, was ich in weiser Voraussicht schon vorher gemacht hatte, um etwaige Fehlerursachen gleich gar nicht erst entstehen zu lassen. Gleichermaßen habe ich auch Sonderzeichen entfernt. Ich will aber nicht ausschließen, dass sich nicht doch irgendwelche Zeichen eingeschlichen haben, die ich wegen der Menge an Daten ggf. übersehen habe. Ein ? könnte ich z.B. übersehen haben. Ob ein ? aber Einfluss auf Deine Formeln nimmt, weiß ich aber nicht.
Ich bin jetzt nicht der Excel Experte, aber verrate mir bitte, wo ich Deinen zuletzt geänderten VBA Code editieren kann. In den Entwicklertools finde ich dazu nichts.
02.08.2016, 16:17 (Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2016, 12:54 von Rabe.
Bearbeitungsgrund: Zitat auf Relevantes reduziert
)
(02.08.2016, 15:11)Gast 123 schrieb: Schaut euch den zerlegten und Sortierten String einmal selnbst an. Jetzt kann man auch in VBA -ohne- Text vergleichen dirket nach dem vollen Namen suchen. Vorher musste ich auch per Makro zwischen Text: "AT", "ATS", "ATI", und Teilsstrings in anderen Namen unterscheiden. Das kostet Rechenzeit.
Vielleicht hift euch mein Gedanke die Sache auch mal so zu betrachten weiter.
Also auch wenn man mich hier inzwischen als Schlangenlinienfahrer betitelt :), habe ich doch mehrfach die Bezeichnung ID genannt und die sind ihrer Natur nach unique. Das gilt für beide zu vergleichende Spalten. Trotzdem sorry wenn Du (von mir) in die Irre geleitet wurdest. Dass es bei vielen Werten gar keinen Vergleichswert gibt und bei anderen x-fache viele liegt in der Natur dieser Daten. Nur zum groben Verständnis dafür. Die eine Spalte sind Händlernamen und die anderen deren Produkte. Ein Händler kann also viele Produkte haben und ein anderer warum auch immer gar keine, was den Sachverhalt vielleicht erklären könnte.
Dass es mitunter Stunden dauert bis der Vergleichsvorgang abgeschlossen ist, kann ich verschmerzen. Das ist wenn überhaupt nur ein 1-maliger Akt.
Zitat:Also auch wenn man mich hier inzwischen als Schlangenlinienfahrer betitelt [img] Dateiupload bitte im Forum! So geht es: Klick mich! ],
ich hatte dich heute morgen zwar das erste mal als Schlangen(linien)fahrer angesprochen, ich wollte dich aber keinesfalls beleidigen. Sollte meine eigentlich humorvoll gemeinte Anrede dich verletzt haben, bitte ich das zu entschuldigen. Ich hatte deinen Nickname lediglich ganz grob übersetzt:
[ Bild bitte so als Datei hochladen: Klick mich! ]
Samma mehr guat? :15:
Gruß Günter Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen. angebl. von Georg Christoph Lichtenberg (1742-1799)