776 Aufrufe
Gefragt in Tabellenkalkulation von Mitglied (481 Punkte)
Hallo Zusammen,

wie lässt sich denn aus einer Buchstaben/Ziffernfolge eine Übereinstimmung finden?

Beispiel:
in den Rohdaten steht z.B.
123456789101112
1234567891011
12345678910
123456789
12345678
1234567
123456
12345
1234

In meiner Suchtabelle befinden sich zusammengesetzte Werte, wo ich nicht genau weiß wie zerlegen...

wert 1234jksdrd soll finden 1234
wert 1234500112244 soll finden 12345 usw.

derzeit habe ich das mit einer Vielzahl von SVerweisen gelöst
in A3 stehen die Anzahl der Zeichen
so kann ich [xurl=http://jamaipa.de|Jamaipa - Suche ohne Spam und Shops]suchen[/url] nach den ersten 16 Zeichen von links, dann den ersten 15 Zeichen von linkst usw.

=WENN(ISTFEHLER(SVERWEIS(LINKS($A3;C$2);Rohdaten!$A$2:$N$3321;8;FALSCH));"";SVERWEIS(LINKS($A3;C$2);Rohdaten!$A$2:$N$3321;8;FALSCH))

Frage:
Lässt sich das mit einem VBA Befehlt bewerkstelligen?

4 Antworten

0 Punkte
Beantwortet von
Hallo Happy,

für eine VBA-freie Lösung würde ich das ähnlich aufbauen, wie du. Hier bleibt einem leider nichts anderes übrig, als wirklich jeden Teil um jeweils
ein Zeichen weniger erneut zu suchen, da du leider eine lange Zeichenkette mit eher uninteressantem Rattenschwanz innerhalb einer kurzen
suchst. Umgekehrt wäre es einfacher.

Mit einer Benutzerdefinierten Funktion ließe sich das allerdings bewerkstelligen. Wenn du in ein allgemeines Modul (z.B. Modul1) den folgenden
Code eingibst...

[code]Function TEILSVERWEIS(Bedingung, SuchBereich, Spalte, Optional Genauigkeit)
  Dim Teil As String, i As Long
  For i = Len(Bedingung) To 1 Step -1
    Teil = Left(Bedingung, i)
    Res = Application.VLookup(Teil, SuchBereich, Spalte, Genauigkeit)
    If Not IsError(Res) Then
      TEILSVERWEIS = Res
      Exit Function
    End If
  Next i
  TEILSVERWEIS = Res
End Function[/code]

...solltest du mit einer Formel wie [b]=wennfehler(Teilsverweis(A3;Rohdaten!$A$2:$H$10;8;0);"") [/b] dein Ziel erreichen. Vorraussetzung ist
allerdings, dass die Vergleichswerte in den Rohdaten tatsächlich reine Texte sind. Falls du diese Daten erst als Zahl eingibst und dann lediglich
die Zelle als Text formatierst, wird der Wert von Sverweis erst gefunden, nachdem du nochmals in die Formelzeile gehst und nochmals Enter
drückst. Da du aber bereits ein paar SVERWEIS-Formeln hast gehe ich davon aus, dass das nicht nötig ist.

Gruß Mr. K.
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
Möchte dir an dieser Stelle empfehlen das in Access zu machen.

Die Antwort mit der Funktion hatte ich ähnlich geschrieben aber der Kollege war schneller... Ist in jeden Fall für kleinere Datenmengen mit wenigen tausend einträgen sinnvoll.

In Access würde man dafür eine Abfrage schreiben - die könnte dann so aussehen:

Anstelle von 2 Blättern gibt es dann 2 Tabellen, die eine nenne ich nun also wie du sie genannt hast [b]Rohdaten[/b]. Anstelle von Spalte A gibts hier eine Spalte mit dem namen [b]rohwert[/b].
Das andere Blatt nennen wir mal [b]Suchtabelle[/b], hier ist der vergleichswert nicht Spalte A oder so sondern [b]textwert[/b] genannt.

Für eine kürzere Schreibreise und weil eine Tabelle 2x benutzt wird (Leider kennt Access nicht so gute befehle wie andere Datenbanken) ist nun die Rohdatentabelle einmal als R und einmal als RT bekannt, und die andere als D.

SELECT * FROM (
SELECT D.textwert, MAX(Len(R.rohwert)) AS maxroh
FROM Suchtabelle AS D INNER JOIN Rohdaten AS R ON D.textwert LIKE R.rohwert + '*'
GROUP BY D.textwert
) DT
INNER JOIN Rohdaten AS RT ON DT.textwert LIKE RT.rohwert + '*' AND Len(RT.rohwert)=DT.minroh

Das Ergebniss enthält nun ausgewählte Spalten der Suchtabelle, zusätzlich eine Spalte in der die Länge der Übereinstimmung steht (dies ist nötig um nur ein Ergebnis zu erhalten wenn 1234 und 12345 usw übereinstimmen) und den übereinstimmenden Teil:

[code]textwert    maxroh    rohwert
1234jksdrd soll    4    1234
1234500112244    5    12345[/code]
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

dann komme ich mit dem 3. Vorschlag :-).

Du kannst das auch per Schleife lösen.

[code]Sub beispiel()

Dim strSuchbegriff As String
Dim lngZeile As Long
Dim i As Long

strSuchbegriff = "1234jksdrd"

For i = Len(strSuchbegriff) To 1 Step -1
 'Suchbegriffe stehen in aktueller Tabelle in Spalte A ab Zeile 2
 For lngZeile = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
  If Left(strSuchbegriff, i) = CStr(Cells(lngZeile, 1).Value) Then
    MsgBox "Gefunden in Zeile " & lngZeile & ": " & Cells(lngZeile, 1).Value
    Exit Sub
  End If
 Next lngZeile
Next i

End Sub[/code]
Falls mehrere Ergebnisse möglich sind, kann man diese z.B. in ein Array schreiben und dann auf einem Tabellenblatt ausgeben.

Gruß

M.O.
0 Punkte
Beantwortet von Mitglied (481 Punkte)
Hallo,

die Lösung von xlKing mittels [b]Function TEILSVERWEIS[/b] finde ich gut.

Echt super ! Hätte ich mal früher gefragt.

Danke Euch und besonders xlKing !! :)
...