Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: [Text] aus String extrahieren

[Text] aus String extrahieren
29.09.2007 12:47:30
{Boris}
Hi Leute,
ich möchte per VBA aus einem String die Textteile in [eckigen Klammern] extrahieren.
Beispielstring:
"Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
Daraus benötige ich ein Array, das aus den Elementen [Ab], [Eb] und [Bbm] besteht.
Das Ziel ist es, die einzelnen Elemente zu verändern (in einem neuen Array) und an exakt die selbe Stelle im String zurück zu schreiben (das bekomme ich dann selbst hin - mit Replace String, "altes Element", "neues Element").
Gibt es eine Möglichkeit, das zu bewerkstelligen, ohne in einer Schleife jedes einzelne Zeichen zu durchlaufen und mit InStr, Mid und Konsorten zu arbeiten?
Wie stelle ich das am Besten an?
Grüße Boris

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Meine Schleifenlösung sieht wie folgt aus
29.09.2007 13:05:50
{Boris}
Hi Leute,

Option Explicit
Sub test()
Dim S As String, arr()
Dim x As Integer, y As Integer, i As Integer
S = "Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
For x = 1 To Len(S)
If Mid(S, x, 1) = "[" Then
For y = x To Len(S)
If Mid(S, y, 1) = "]" Then
ReDim Preserve arr(i)
arr(i) = Mid(S, x, y - x + 1)
i = i + 1
Exit For
End If
Next y
End If
Next x
For x = 0 To UBound(arr)
MsgBox arr(x)
Next x
End Sub


Wie gesagt - geht es auch ohne die Schleife? Wenn ja: Wie?
Grüße Boris

Anzeige
AW: [Text] aus String extrahieren
29.09.2007 13:10:54
Daniel
Hi
mit ein paar Tricks kannst du den Text in über die SPLIT-Funktion in ein passendes Array-Feld zerlegen.
(das Verwendete Trennzeichen (hier "+") sollte im Text ansonsten nicht vorkommen)
dann brauchst du noch ne 2. Array-Variable, in die du alle Werte einliest, die mit [ beginnen:

Sub test()
Dim a As String, msgText As String
Dim b() As String
Dim c() As String
Dim i As Long, j As Long
a = "Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
a = Replace(a, "[", "+[")
a = Replace(a, "]", "]+")
b = Split(a, "+")
For i = 0 To UBound(b)
If Left(b(i), 1) = "[" Then
ReDim Preserve c(j)
c(j) = b(i)
j = j + 1
End If
Next
For i = 0 To UBound(c)
msgText = msgText & Chr(10) & c(i)
Next
MsgBox "die Array-Variable C enthält folgende Elemente:" & msgText
End Sub


Gruß, Daniel

Anzeige
Besten Dank
29.09.2007 14:10:59
{Boris}
Hi Daniel,
gute Idee, die Trennzeichen eindeutig zu machen. Da bin ich grad nicht drauf gekommen ;-) Das reduziert die Anzahl der Schleifendurchläufe bereits enorm.
Vielen Dank und
Grüße Boris

AW: Besten Dank
29.09.2007 14:37:25
Gerd
Hallo Boris,
oder so:

Sub test()
Dim NeueTexte As Variant, strText As String, i As Integer
NeueTexte = Array("Text1", "Text2", "Text3")
strText = "Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
For i = 0 To 2
strText = Replace(strText, Split(Split(strText, "[")(i + 1), "]")(0), NeueTexte(i), 1, 1, 1)
Next
MsgBox strText
End Sub


Gruß Gerd

Anzeige
Das muss ich erst mal nachvollziehen...
29.09.2007 18:06:00
{Boris}
Hi Gerd,
...wie Du da die Replace-und die Split-Funktion gebrauchst. Ich melde mich wieder.
Danke und
Grüße Boris

Auchnochmeinensenfdazu
29.09.2007 15:08:58
Nepumuk
Hi Boris,
noch ne Möglichkeit:
Public Sub Test()
    Dim objRegEx As Object, objMatch As Object, objMatchCollection As Object
    Dim strText As String
    strText = "Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
    Set objRegEx = CreateObject("VBScript.RegExp")
    With objRegEx
        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = "\[\w*\]"
        Set objMatchCollection = .Execute(strText)
    End With
    For Each objMatch In objMatchCollection
        MsgBox "Wert: " & objMatch.Value & " Position: " & objMatch.FirstIndex & " Länge: " & objMatch.Length
    Next
End Sub

Gruß
Nepumuk

Anzeige
Darauf hatte ich (insgeheim) gehofft...
29.09.2007 16:35:11
{Boris}
Hi Max,
...denn dass es mit den RegExps (wovon ich gar keine Ahnung habe) geht, hatte ich schon vermutet.
Und natürlich funktioniert Dein Beispiel einwandfrei.
Besten Dank!
Grüße Boris
(muss mich wirklich mal langsam mit den RegExps beschäftigen...)

AW: Split(Split..
29.09.2007 23:05:00
Gerd
Hi Boris,
ich hatte unterstellt, dass Du sofort in den Gesamtstring zurückschreiben möchtest.
Lasse das Makro über ein leeres Sheet laufen.
(Ausgaben von innen nach außen, die Replace-

Function u. die weiteren Argumente der Splitfunktion habe ich weggelassen.)


Sub test2()
Dim strText As String
strText = "Don't [Ab]claim that love you [Eb]never let me [Bbm]feel"
Cells(1, 1) = "Split(strText," & """[""" & ")(0)"
Cells(1, 3) = Split(strText, "[")(0)
Cells(2, 1) = "Split(strText," & """[""" & ")(1)"
Cells(2, 3) = Split(strText, "[")(1)
Cells(3, 1) = "Split(strText," & """[""" & ")(2)"
Cells(3, 3) = Split(strText, "[")(2)
Cells(4, 1) = "Split(strText," & """[""" & ")(3)"
Cells(4, 3) = Split(strText, "[")(3)
Cells(6, 1) = "Split(Split(strText," & """[""" & ")(0)," & """]""" & " )(0)"
Cells(6, 4) = Split(Split(strText, "[")(0), "]")(0)
Cells(7, 1) = "Split(Split(strText," & """[""" & ")(1)," & """]""" & " )(0)"
Cells(7, 4) = Split(Split(strText, "[")(1), "]")(0)
Cells(8, 1) = "Split(Split(strText," & """[""" & ")(2)," & """]""" & " )(0)"
Cells(8, 4) = Split(Split(strText, "[")(2), "]")(0)
Cells(9, 1) = "Split(Split(strText," & """[""" & ")(3)," & """]""" & " )(0)"
Cells(9, 4) = Split(Split(strText, "[")(3), "]")(0)
End Sub


Gruß Gerd

Anzeige
Yepp - alles klar...
29.09.2007 23:08:00
{Boris}
Hi Gerd,
...hab´s kapiert. Danke nochmals!
Grüße Boris
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

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