Anzeige
Archiv - Navigation
1692to1696
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Suche mit String als Rückgabewert

VBA Suche mit String als Rückgabewert
12.05.2019 20:15:47
Christoph
Hallo,
ich würde gerne in einer Excel-Zelle nach einem String mit Wildcard suchen und dann den gefunden String als Rückgabewert erhalten.
Beispiel:
Zelleninhalt: "The reference year is 2010. Data is of high quality. Data valid for Germany."
Such-String: "data * quality"
Rückgabewert: "Data is of high quality"
Ist so etwas möglich? Mir sind nur Funktionen bekannt mit denen ich die Position der Zelle finde, nicht aber den gefunden Text erhalte.
Vielen Dank schon einmal für eure Hilfe!
VG Christoph

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Suche mit String als Rückgabewert
12.05.2019 20:44:31
Sepp
Hallo Christoph,
Sub searchString()
  Dim rng As Range, strSearch As String, strReturn As String
  Dim varSplit As Variant, lngIndex As Long

  strSearch = "data * quality"

  With Sheets("Tabelle1") 'Tabellenname anpassen! 
    Set rng = .Columns(1).Find(What:=strSearch, Lookat:=xlPart, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False)
    If Not rng Is Nothing Then
      varSplit = Split(rng.Text, ".")
      For lngIndex = 0 To Ubound(varSplit)
        If LCase$(Trim$(varSplit(lngIndex))) Like LCase$(strSearch) Then
          MsgBox Trim$(varSplit(lngIndex))
          Exit For
        End If
      Next
    End If
  End With
  
  Set rng = Nothing
End Sub

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0

gesucht wird in Spalte A.
Anzeige
AW: VBA Suche mit String als Rückgabewert
12.05.2019 22:49:36
Christoph
Hey,
vielen Dank für die schnellen Antworten. Leider lösen sie nicht mein Problem. -Ich muss wohl etwas mehr ins Detail gehen:
Ich arbeite an einem Programm das Zelleninhalte nach Textmustern durchsucht.
Die Textmuster können vom Nutzer selbst festgelegt werden. Denkbar sind fixe Textmuster ("all relevant data collected") oder variable Textmuster ("required data * quality"). Ein Textmuster wie "reference year *", mit einer Wildcard am Ende oder am Anfang, ergibt hingegen keinen Sinn und darf daher nicht gewählt werden.
-- Folglich reicht es nicht aus die Positionen vom ersten und letzten Wort des Textmusters zu suchen, da erst die Kombination mit anderen Wörter ausschlaggebend sein kann.
Auch die Zelleninhalte sind variabel.
-- Eine Trennung nach Satzzeichen ist daher auch nicht möglich.
Woher kommt meine Hoffnung, dass eine Funktion existiert, die mir den gefundenen String zurückgibt? -Die Suchen&Ersetzen-Funktion von Excel muss etwas vergleichbares machen: Ich kann nach einem String mit Wildcard suchen und durch einen anderen String ersetzen. Dabei wird in Abhängigkeit vom gefundenen String ein anderer Text ersetzt:
Zelleninhalt1: "The reference year is 2010. Data is of high quality. Data valid for Germany."
Zelleninhalt2: "Data collection is complete. Data is of low quality. Find more information in Annex A"
Such-Text: "Data * quality"
Ersetzen: Test123
neuer Zelleninhalt1: "The reference year is 2010. Test123. Data valid for Germany."
neuer Zelleninhalt2: "Data collection is complete. Test123. Find more information in Annex A"
Nochmals Danke für die Hilfe!
VG Christoph
Anzeige
AW: VBA Suche mit String als Rückgabewert
13.05.2019 19:14:32
Sepp
Hallo Christoph,
dann evtl. so.
Sub searchString()
  Dim objRegEx As Object, objSubMatch As Object, objMatch As Object
  Dim rng As Range, strSearch As String, strReturn As String
  Dim varSplit As Variant, lngIndex As Long

  strSearch = "data*quality"

  If strSearch Like "*[*]*" Then
    With Sheets("Tabelle1") 'Tabellenname anpassen! 
      Set rng = .Columns(1).Find(What:=strSearch, Lookat:=xlPart, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False)
      If Not rng Is Nothing Then
        Set objRegEx = CreateObject("VBScript.RegExp")
        With objRegEx
          .Pattern = "(?=" & Trim$(Split(strSearch, "*")(0)) & "\s).*?(\s+" & Trim$(Split(strSearch, "*")(1)) & ")"
          .IgnoreCase = True
          .Global = True
          Set objMatch = .Execute(rng.Text)
          If objMatch.Count > 0 Then MsgBox objMatch(0)
        End With
      End If
    End With
  Else
    MsgBox "Ungültiger Suchstring!"
  End If
    
  Set rng = Nothing
End Sub

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


Anzeige
AW: VBA Suche mit String als Rückgabewert
12.05.2019 20:50:08
Daniel
Hi
kommt darauf an.
du kannst doch nach der Position von "data" suchen und der Position von "quality"
dann addierst du noch die länge von "quality" dazu und hast Start- und Endposition.
Damit kannst du dir dann den Text zwischen diesen beiden Positionen ausgeben lassen, nach dem Schema:
Pos1 = Position von "data"
Pos2 = Position von "quality" + Länge von "quality"
Suchtext =Teil(Text, Pos1, Pos2-Pos1+1)
Gruß Daniel
solange die Worte im Gesamtext nur einmal vorkommen, sollte das problemlos gehen
AW: VBA Suche mit String als Rückgabewert
12.05.2019 22:48:00
Christoph
Hey,
vielen Dank für die schnellen Antworten. Leider lösen sie nicht mein Problem. -Ich muss wohl etwas mehr ins Detail gehen:
Ich arbeite an einem Programm das Zelleninhalte nach Textmustern durchsucht.
Die Textmuster können vom Nutzer selbst festgelegt werden. Denkbar sind fixe Textmuster ("all relevant data collected") oder variable Textmuster ("required data * quality"). Ein Textmuster wie "reference year *", mit einer Wildcard am Ende oder am Anfang, ergibt hingegen keinen Sinn und darf daher nicht gewählt werden.
-- Folglich reicht es nicht aus die Positionen vom ersten und letzten Wort des Textmusters zu suchen, da erst die Kombination mit anderen Wörter ausschlaggebend sein kann.
Auch die Zelleninhalte sind variabel.
-- Eine Trennung nach Satzzeichen ist daher auch nicht möglich.
Woher kommt meine Hoffnung, dass eine Funktion existiert, die mir den gefundenen String zurückgibt? -Die Suchen&Ersetzen-Funktion von Excel muss etwas vergleichbares machen: Ich kann nach einem String mit Wildcard suchen und durch einen anderen String ersetzen. Dabei wird in Abhängigkeit vom gefundenen String ein anderer Text ersetzt:
Zelleninhalt1: "The reference year is 2010. Data is of high quality. Data valid for Germany."
Zelleninhalt2: "Data collection is complete. Data is of low quality. Find more information in Annex A"
Such-Text: "Data * quality"
Ersetzen: Test123
neuer Zelleninhalt1: "The reference year is 2010. Test123. Data valid for Germany."
neuer Zelleninhalt2: "Data collection is complete. Test123. Find more information in Annex A"
Nochmals Danke für die Hilfe!
VG Christoph
Anzeige
AW: VBA Suche mit String als Rückgabewert
12.05.2019 23:16:44
Daniel
naja, wo ist das Problem?
wenn der Anwender "required data * quality" eingibt dann musst du halt die Position von "required data " und von "quality" ermitteln.
also die Position des Textes vor dem * und die Position des Textes nach dem *
wenn du diese beiden Positionen hast, lässt du dir den Text dazwischen ausgeben.
eine Funktion in Excel oder VBA, die genau das macht was du beschreibst, ist mir nicht bekannt, ggf gibts was in den Regulären Ausdrücken (Regex): https://www.vba-tutorial.de/applikation/regexp.htm
aber da müsstest du dich selber mal einlesen, weil damit kenne ich mich nicht aus.
ich würde es halt wie beschrieben lösen, das ist ja jetzt auch nicht sonderlich kompliziert
Gruß Daniel
Anzeige
AW: VBA Suche mit String als Rückgabewert
13.05.2019 20:29:09
Christoph
Vielen Dank an Alle für die Hilfestellungen. Ich denke es gibt hier viele Wege ans Ziel zu kommen. Ich habe mich nun für die Regulären Ausdrücke entschieden. Die Execute-Funktion ist genau das was ich gesucht habe und zumindest für mich die eleganteste Lösung:
Sub suchInZeile()
Dim regex As New RegExp, Fundstellen As MatchCollection, Fund As Match
Dim myString As String
myString = "Zeile A" & vbNewLine & "Zeile B"
regex.Pattern = "\w$"
regex.MultiLine = True
regex.Global = True
Set Fundstellen = regex.Execute(myString)
Debug.Print Fundstellen.Count
For Each Fund In Fundstellen
Debug.Print Fund
Next
End Sub
VG Christoph
Anzeige
Es gibt auch eine Xl-Fkt ERSETZEN und eine, ...
13.05.2019 04:50:23
Luc:-?
…die WECHSELN heißt, Christoph;
mit Ersterer wäre dein ursprüngliches Bsp so lösbar (QuellText in I8):
=ERSETZEN(LINKS(I8;SUCHEN("quality";I8)+LÄNGE("quality"));1;SUCHEN("data";LINKS(I8;SUCHEN("quality"; I8)))-1;"")
Sind aber mehrere, direkt aufeinanderfolgende Wörter relevant (hier bspw high quality), müsste die Fml eben wie folgt lauten:
=ERSETZEN(LINKS(I8;SUCHEN("high quality";I8)+LÄNGE("high quality"));1;SUCHEN("data";LINKS(I8;SUCHEN("high quality";I8)))-1;"")
Mit einer speziellen UDF von mir könnte man noch LÄNGE einsparen, aber das dürfte kaum relevant sein, da das Prinzip ganz ähnlich ist (Fml verwendet statt SUCHEN eine auf dem vbOperator Like basierende Fkt mit Zählung von vorn bis VglswortEnde oder von hinten bis VglswortAnfang).
Morhn, Luc :-?
„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

Anzeige

139 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige