Reguläre Ausdrücke in VBA

Hallo allerseits

Ich möchte in Excel mit VBA Zeichenfolgen mit regulären Ausdrücken auswerten.
Das klappt soweit auch, allerdings möchte ich von der gefundenen Zeichenfolge nur einen Teil weiterverarbeiten.
Ich erklär das mal an einem Beispiel:

'variablen initialisieren
Dim reg_exp As Object, reg_exp_result As Object
Dim input_str as String

'Werte zuweisen
Set reg_exp = CreateObject(„vbscript.regexp“)
input_str= „1as fd&&aa&&aff asd sd&&q q&&af asdf sad&&ww&& fs aab694“

'Eigenschaften des reglären Ausdrucks
with reg_exp
.Pattern = „&{2}(.*)&{2}“
.IgnoreCase = True
.Global = True
.MultiLine = False
end with

'regulären Ausdruck anwenden
Set reg_exp_result = reg_exp.Execute(input_str)

'Resultate ausgeben
If reg_exp_result.Count > 0 Then
For Each reg_exp_result In reg_exp_result
MsgBox (reg_exp_result.Value)
Next
Else
MsgBox („not found“)
End If

'Resultat-Variable zurücksetzen
Set reg_exp_result = Nothing

Mit diesem Code werden die folgenden 3 Ausdrücke gefunden:
&&aa&&
&&q q&&
&&ww&&

Das ist aber nur fast, was ich möchte: In den Resultaten soll jeweils nur das gefunden werden, was zwischen den je zwei && steht. Anders gesagt: obwohl ich den ganzen Ausdruck brauche für die Suche, möchte ich jeweils im Resultat nur das haben, was ich im regulären Ausdruck eingeklammert habe --> (.*)
Das gewünschte Resultat wäre also:
aa
q q
ww

Kann mir jemand sagen, wie ich ich das hinkriege?

viele Grüsse,

Stephan

input_str= „1as fd&&aa&&aff asd sd&&q q&&af asdf sad&&ww&& fs
aab694“

Das gewünschte Resultat wäre also:
aa
q q
ww
Kann mir jemand sagen, wie ich ich das hinkriege?

Hi Stephan,

mit reg.exp kenne ich mich nicht aus:

Sub dd()
Dim input\_str As String, Teil, T As Integer
input\_str = "1as fd&&aa&&aff asd sd&&q q&&af asdf sad&&ww&& fs aab694"
Teil = Split(input\_str, "&&")
For T = 1 To UBound(Teil) - 1 Step 2
 MsgBox Teil(T)
Next T
End Sub

Gruß
Reinhard

Hi Stephan,

mit deiner Formel kam ich nicht klar, vielleicht so:

Sub nn()
Dim reg\_exp As Object, reg\_exp\_result As Object
Dim input\_str As String
'Werte zuweisen
Set reg\_exp = CreateObject("vbscript.regexp")
input\_str = "1as fd&&aa&&aff asd sd&&q q&&af asdf sad&&ww&& fs aab694"
'Eigenschaften des reglären Ausdrucks
With reg\_exp
 .Pattern = "&{2}[a-z]{0,}&{2}"
 .IgnoreCase = True
 .Global = True
 .MultiLine = False
End With
'regulären Ausdruck anwenden
Set reg\_exp\_result = reg\_exp.Execute(input\_str)
'Resultate ausgeben
If reg\_exp\_result.Count \> 0 Then
 For Each reg\_exp\_result In reg\_exp\_result
 MsgBox Replace(reg\_exp\_result.Value, "&&", "")
 Next
Else
 MsgBox "not found"
End If
'Resultat-Variable zurücksetzen
Set reg\_exp\_result = Nothing
End Sub

Gruß
Reinhard

Grüezi Stephan

Ich möchte in Excel mit VBA Zeichenfolgen mit regulären
Ausdrücken auswerten.
Das klappt soweit auch, allerdings möchte ich von der
gefundenen Zeichenfolge nur einen Teil weiterverarbeiten.

[Code gesnippt]

Mit diesem Code werden die folgenden 3 Ausdrücke gefunden:
&&aa&&
&&q q&&
&&ww&&

Ich bekomme hier allerdings nur den Ausgangs-String zurückgeliefert, nicht aber die drei aufgedröselten Inhalte.

Das ist aber nur fast, was ich möchte: In den Resultaten soll
jeweils nur das gefunden werden, was zwischen den je zwei &&
steht. Anders gesagt: obwohl ich den ganzen Ausdruck brauche
für die Suche, möchte ich jeweils im Resultat nur das haben,
was ich im regulären Ausdruck eingeklammert habe --> (.*)
Das gewünschte Resultat wäre also:
aa
q q
ww

Kann mir jemand sagen, wie ich ich das hinkriege?

Wenn das Ganze bei dir ansonsten aber klappt (was ich wie gesagt leider nicht nachvollziehen kann) kannst Du diese Zeile hier:

 MsgBox (reg\_exp\_result.Value)

durch die folgende ersetzen:

 MsgBox Replace(reg\_exp\_result.Value, "&&", "")

welche dir dann die überzähligen ‚&&‘ entfernt.

Allenfalls, wenn es nicht immer dieselben ‚&&‘ sind kannst Du auch mit Mid(), Left() oder Right() die Ergebnisse bearbeiten.

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Grüezi Stephan nochmals

Allenfalls, wenn es nicht immer dieselben ‚&&‘ sind kannst Du
auch mit Mid(), Left() oder Right() die Ergebnisse bearbeiten.

…das wäre dann sowas hier:

 MsgBox Mid(.Value, 3, .Length - 4)

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Besten Dank, das hilft mir weiter. Habe vor lauter Wunsch nach Ästhetik gar nicht daran gedacht, das Problem in 2 Schritten zu lösen…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]