Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
908to912
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
908to912
908to912
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

[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

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

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

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige