Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA String-In-String-Suche mit Wildcard

Forumthread: VBA String-In-String-Suche mit Wildcard

VBA String-In-String-Suche mit Wildcard
01.02.2004 10:29:16
Lupus
Hallo Excel-User,
ich bin auf der Suche nach einem Code der einen String (strMatch), welcher Wildcards enthält, in einem anderen String(strCheck) sucht und der den gefundenen String zurückgibt.
Mit folgendem Code finde ich die erste Position von strMatch in strCheck.
lngPos = Application.WorksheetFunction.SearchB(strMatch, strCheck, lngLast)
1. Wie finde ich jetzt heraus, um welchen String es sich handelt?
2. WorksheetFunction.SearchB kann keine Strings größer (~) 32.500 Characters bearbeiten.
Wie müsste die Gleichung für lngPos aussehen, wenn der String größer 32.500 Characters ist, ohne vorher den String zu stückeln und mit einer Schleife zu durchlaufen müssen?
Gruß Lupus
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 10:48:44
Nepumuk
Hallo Wolf,
schau dir mal den Like - Operator an.
Gruß
Nepumuk
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 11:55:06
Lupus
Hallo Nepumuk,
Mit Like habe ich das schon versucht, leider vergebens; hier mein Ansatz:

Sub Test()
Dim strCheck As String, strMatch As String, strFound As String
Dim lngPos As Long
strCheck = "Lupus bekommt das nicht hin!"
strMatch = "u*n"
lngPos = 1
lngPos = InStr(lngPos, strCheck, strCheck Like "*" & strMatch & "*")
'Das Ergebnis von lngPos ist 0.
'StrFound = ????? welchen Code-Schnipsel gibt es hierfür?
End Sub

Wenn ich lngPos bestimmen kann, kann ich über eine Schleife die weiteren Fundstellen und strFound finden / bestimmen.
Gruß Lupus
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 12:54:55
Nepumuk
Hallo Wolf,
bei einem Vergleich mit Like, macht es wenig Sinn die Posititon der Ubereinstimmung zurückzubekommen. In deinem Beispiel gibt es schon vier Stück davon.

"Lupus bekommt das nicht hin!"

"Lupus bekommt das nicht hin!"

"Lupus bekommt das nicht hin!"

"Lupus bekommt das nicht hin!"
Welche Position soll da angegeben werden?
Gruß
Nepumuk

Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 13:24:02
Lupus
Hallo Nepumuk,

> Welche Position soll da angegeben werden?
genau das ist ja mein Problem.
Mein strCheck ist seeehr lang, die Anfongsposition weiß ich nicht. Vielleicht kann man diese über eine Schleife definieren, irgendwie mit Left und strReduced = Len(strCheck) - 1.
Dies sind halt nur Ideen, die ich aber leider nicht umsetzen kann.
Gruß Lupus
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 13:34:30
Nepumuk
Hallo Wolf,
um bei deinem Beispiel zu bleiben, du könntest mit der Instr - Funktion nach dem ersten Vorkommen von u und nach dieser Position nach n weitersuchen. Das wäre auch sehr schnell.
Gruß
Nepumuk
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 14:43:24
Lupus
Hallo Nepumuk,
danke für den Ansatz; also wie
lngPos = InStr(lngPos, strCheck, Left(strMatch, 1))
und wie geht's weiter???
Mit der mid-Funktion kann ich zwar einen String zurückgeben, da ich aber nicht weiß wie lang strFound ist, komme ich damit auch nicht weiter.
strFound = Mid(strCheck, lngPos, [Length])
Ich habe mich auch schon in anderen VB(A)-Foren nach Lösungen umgesehen (habe aber kein cross posting durchgeführt) bin dort aber auch nicht auf ähnliche Fragestellungen / Lösungsansätze getroffen.
Auch eine Alertnativ-Lösung für SearchB konnte ich nicht finden, geschweige denn eine Erklärung für SearchB in der VBA-Hilfe.
Irgendwie wurmt mich das (damit meine ich nicht Dich), so schwer kann das doch gar nicht sein hierfür eine einfache Lösung zu finden.
Wäre Dir sehr dankbar, wenn Du mir irgendwie weiterhelfen könntest.
Gruß Lupus
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 14:55:25
Nepumuk
Hallo Wolf,
versuch mal ein realistisches Szenario zu entwerfen, in der du das einsetzen musst. Dann tu ich mir leichter.
Gruß
Nepumuk
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 16:04:37
Lupus
Hallo Nepumuk,
mein Szenario sieht leider genau so aus, wie ich es beschrieben habe.
In einem großen String (strCheck) suche alle möglichen Strings, die einem Vergleichsstring (strMatch) entsprechen. Die gefundenen Vergleichsstrings und deren Anfangs und Endpositionen schreibe ich ein Array. Dies klappt alles prima, solange nicht mit Wildcards wie "*" und "?" gearbeitet wird.
Folgenden Ansatz habe ich jetzt formuliert. Leider gibt auch dieser nicht den exakten strFound zurück.

Sub Test()
Dim strCheck As String, strMatch As String
Dim strFound As String, strFirstChr As String
Dim lngPos As Long, i As Integer
strCheck = "Lupus bekommt das nicht hin! Sauerei!"
strMatch = "u*e"
strFirstChr = Left(strMatch, 1)
i = 1
lngPos = Application.WorksheetFunction.SearchB(strMatch, strCheck, 1)
For lngPos = 1 To Len(strCheck)
lngPos = InStr(lngPos, strCheck, strFirstChr)
If lngPos = 0 Then Exit For
strFound = Mid(strCheck, lngPos, LenFoundString(strCheck, strMatch))
Cells(i, 1).Value = strFound
i = i + 1
Next
End Sub


Public

Function LenFoundString(strCheck, strMatch) As Long
Dim lngLen As Long
lngLen = Len(strCheck)
While Left(strCheck, lngLen) Like strMatch
lngLen = lngLen - 1
Wend
LenFoundString = lngLen + 1
End Function

Der Code müßte noch in bezug auf strFirstChr = Left(strMatch, "Anzahlzeichen vor dem *")verbessert werden.
Aber auch das wäre keine optimale Lösung, denn der Suchstring könnte auch "u*u*e" lauten.
Ist schon eine verzwickte Sache.
Gruß Lupus
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
01.02.2004 19:41:59
Nepumuk
Hallo Wolf,
ok, und was sollte nach diesem Beispiel genau zurückgegeben werden?
Gruß
Nepumuk
AW: VBA String-In-String-Suche mit Wildcard
02.02.2004 16:15:53
Lupus
Hallo Nepumuk,
> ok, und was sollte nach diesem Beispiel genau zurückgegeben werden?
Ein oder mehrere Strings und dessen/deren Position/en in strCheck.
Bei dem String handelt es sich nicht um einen normalen Text-Code, sondern um den genetischen Code, in dem ich bestimmte Sequenzen suche. Die gefundene Sequenz wird dann nach physikalischen und chemischen Eigenschaften weiter ausgewertet.
Ich hoffe, daß Du jetzt eher meine Frage verstehen kannst.
Letztenendes habe ich aber noch keinen Ersatz für
Application.WorksheetFunction.SearchB
gefunden.
Gruß Lupus
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
02.02.2004 17:22:36
Nepumuk
Hallo Wolf,
das bringt doch gleich mehr Licht in die Sache. Du willst die Position der Aminosäuren in einer RNA/DNA. Hast du mal so eine Probesequenz in einer Textdatei zum testen? Ich will nicht eine Stunde auf vier Tasten daddeln. Und wenn es geht einen Vergleichstring nach dem gesucht werden soll? Ich habe da schon eine ungefähre Vorstellung davon, wie das Problem zu lösen ist.
Gruß
Nepumuk (unter anderem auch Mikrobiologe)
Anzeige
AW: VBA String-In-String-Suche mit Wildcard
04.02.2004 14:08:25
Lupus
Hallo Nepumuk,
habe mir mal erlaubt den ganzen Code (mit Lösung) an Deine Email zu schicken.
Gruß Lupus
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

VBA String-In-String-Suche mit Wildcard


Schritt-für-Schritt-Anleitung

  1. Vorbereitung: Öffne deine Excel-Anwendung und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Neues Modul erstellen: Klicke mit der rechten Maustaste im Projektfenster auf "VBAProject (DeineDateiName)" und wähle Einfügen > Modul.

  3. VBA-Code eingeben: Füge den folgenden Code in das Modul ein:

    Sub Test()
       Dim strCheck As String, strMatch As String, strFound As String
       Dim lngPos As Long, i As Integer
    
       strCheck = "Lupus bekommt das nicht hin! Sauerei!"
       strMatch = "u*n"
       i = 1
       lngPos = InStr(1, strCheck, Left(strMatch, 1)) ' Suche nach dem ersten Zeichen
    
       Do While lngPos > 0
           If strCheck Like "*" & strMatch & "*" Then
               strFound = Mid(strCheck, lngPos, LenFoundString(strCheck, strMatch))
               Cells(i, 1).Value = strFound
               i = i + 1
           End If
           lngPos = InStr(lngPos + 1, strCheck, Left(strMatch, 1)) ' Suche nach dem nächsten Zeichen
       Loop
    End Sub
    
    Function LenFoundString(strCheck As String, strMatch As String) As Long
       Dim lngLen As Long
       lngLen = Len(strCheck)
       While Left(strCheck, lngLen) Like strMatch
           lngLen = lngLen - 1
       Wend
       LenFoundString = lngLen + 1
    End Function
  4. Code anpassen: Ändere strCheck und strMatch nach deinen Bedürfnissen, um verschiedene Strings zu testen.

  5. Ausführen: Drücke F5 oder klicke auf Ausführen > Sub/UserForm ausführen, um den Code zu starten.


Häufige Fehler und Lösungen

  • Fehler: lngPos gibt 0 zurück: Stelle sicher, dass der Such-String (strMatch) auch tatsächlich im Text (strCheck) vorhanden ist. Benutze Wildcards wie * oder ?, um Abweichungen zuzulassen.

  • Fehler: Application.WorksheetFunction.SearchB funktioniert nicht: Diese Funktion hat eine Begrenzung von 32.500 Zeichen. Verwende stattdessen die InStr-Funktion, um die Position zu finden.


Alternative Methoden

  • Benutzung des Like-Operators: Der Like-Operator in VBA kann verwendet werden, um zu prüfen, ob ein String übereinstimmt. Zum Beispiel:

    If strCheck Like "*" & strMatch & "*" Then
       ' Aktion ausführen
    End If
  • Reguläre Ausdrücke: Für komplexere Suchen kannst du auch das Microsoft VBScript Regular Expressions-Objekt verwenden.


Praktische Beispiele

  1. Beispiel für die Suche nach Aminosäuren in DNA: Angenommen, du suchst nach Sequenzen in einem langen DNA-String. Setze strCheck auf deine DNA-Sequenz und strMatch auf die gesuchte Aminosäure-Sequenz mit Wildcards.

    strCheck = "AGCTAGCTAGCAGCATCGAATTCG"
    strMatch = "A*G"
  2. Verwendung von Platzhaltern: Stelle sicher, dass du die Wildcard * für beliebige Zeichen und ? für ein einzelnes Zeichen nutzt.


Tipps für Profis

  • Performance-Tipps: Wenn du mit sehr langen Strings arbeitest, kann die Verwendung von Arrays zur Speicherung der Ergebnisse die Leistung verbessern.
  • Debugging: Verwende Debug.Print in deinem Code, um Zwischenergebnisse im Direktfenster anzuzeigen.

FAQ: Häufige Fragen

1. Wie kann ich Wildcards in VBA verwenden? Du kannst Wildcards mit dem Like-Operator verwenden. Zum Beispiel If strCheck Like "*" & strMatch & "*".

2. Was mache ich, wenn mein String länger als 32.500 Zeichen ist? Verwende die InStr-Funktion anstelle von SearchB, da diese keine Begrenzung hat.

3. Kann ich mehrere Wildcards in einem Suchstring verwenden? Ja, du kannst mehrere Wildcards in strMatch verwenden, z. B. u*e*.

4. Wie finde ich die Position der gefundenen Strings? Du kannst die InStr-Funktion verwenden, um die Position des ersten Zeichens der Übereinstimmung zu finden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige