[schwierige Aufgabe] Zelleninhalt nur teilweise vergleichen
#41
Hallo,

hier einmal ein Lösungsvorschlag mit VBA:
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
    varVergleich = Split(rngZelle)
    If varVergleich(1) = varSuche(1) Then
        strAusgabe = strAusgabe & varVergleich(0) & " "
    End If
Next rngZelle

SerpentSuche = strAusgabe
End Function

und Beispiel:


Angehängte Dateien
.xlsm   SerpentBeispiel.xlsm (Größe: 596,83 KB / Downloads: 10)
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.





Top
#42
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?
Top
#43
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.





Top
#44
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.
Top
#45
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.





Top
#46
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.

mfg  Gast 124
Top
#47
Sorry, die Eingabe war zwischendurch abgestürzt, die Mappe wurde niicht hochgeladen.

Hier ist sie.    mfg


Angehängte Dateien
.xlsx   Mappe1 String zerlegt.xlsx (Größe: 1,19 MB / Downloads: 4)
Top
#48
(02.08.2016, 15:03)Ego schrieb: 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).

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.
Top
#49
(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.
Top
#50
Hi Serpent Driver,

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)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste