Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Text in Klammern auslesen

1,368 views
Skip to first unread message

Uwe_Lunkenbein

unread,
Jan 15, 2010, 10:14:20 AM1/15/10
to
Hallo,

Zellen enthalten etwa folgenden Inhalt:
-------
In Klasse 15.20 sind folgende Produkte nicht enthalten: Reis (15.21),
Weizen (18.22)
-------

Nun möchte ich alle Klammertexte in einer anderen Spalte ausgeben.
Alternativ kann auch alles außerhalb der Klammern gelöscht werden.

Gruß und Danke
Uwe

HelmutMit

unread,
Jan 15, 2010, 12:09:44 PM1/15/10
to

Hallo Uwe,
Annahme, in A1 steht Dein String, dann kannst Du mit
=LINKS(RECHTS(A1;LÄNGE(A1)-FINDEN("(";A1));FINDEN(")";RECHTS(A1;LÄNGE
(A1)-FINDEN("(";A1)))-1)
Deinen Klammerinhalt bestimmen.
Gruß Helmut
www.excelmexel.de

Uwe_Lunkenbein

unread,
Jan 15, 2010, 12:35:41 PM1/15/10
to

Hallo Helmut,

mit dieser Funktion lese ich allerdings nur den 1. Klammerinhalt
"15.21" aus. Ziel wäre die beiden Klammerinhalte durch Komma in der
Nachbarzelle zu trennen. Z.B. in B1 = 15.21,18.22. In A1 können zig
Klammerinhalte enthalten sein.

Gruß
Uwe

HelmutMit

unread,
Jan 15, 2010, 1:14:08 PM1/15/10
to

..schön, dass Du Deine Aufgabe so exakt beschreibst. Macht richtig
Spaß!
Helmut

Claus Busch

unread,
Jan 15, 2010, 1:39:19 PM1/15/10
to
Hallo Uwe,

Am Fri, 15 Jan 2010 07:14:20 -0800 (PST) schrieb Uwe_Lunkenbein:

> Zellen enthalten etwa folgenden Inhalt:
> -------
> In Klasse 15.20 sind folgende Produkte nicht enthalten: Reis (15.21),
> Weizen (18.22)
> -------
>

> Nun m�chte ich alle Klammertexte in einer anderen Spalte ausgeben.
> Alternativ kann auch alles au�erhalb der Klammern gel�scht werden.

probiere es mal so:

Sub ZahlenExtrahieren()

Dim LRow As Long
Dim i As Integer
Dim Start As Integer
Dim Anz As Integer
Dim rngZelle As Range
Dim myString As String

LRow = Cells(Rows.Count, 1).End(xlUp).Row
'Hier Bereich anpassen
For Each rngZelle In Range("A2:A" & LRow)
Anz = Len(rngZelle) - Len(Replace(rngZelle, "(", ""))
myString = ""
For i = 1 To Anz
Start = WorksheetFunction.Find("#", _
WorksheetFunction.Substitute(rngZelle, "(", "#", i))
myString = myString & Mid(rngZelle, Start + 1, 5) & ", "
Next i
rngZelle.Offset(0, 1) = myString
Next rngZelle

End Sub


Mit freundlichen Gr�ssen
Claus Busch
--
Win XP PRof SP2 / Vista Ultimate SP2
Office 2003 SP2 /2007 Ultimate SP2

Alexander Wolff

unread,
Jan 15, 2010, 2:09:25 PM1/15/10
to
Claus Busch wrote:
> Sub ZahlenExtrahieren()
>
> Dim LRow As Long
> Dim i As Integer
> Dim Start As Integer
> Dim Anz As Integer
> Dim rngZelle As Range
> Dim myString As String
>
> LRow = Cells(Rows.Count, 1).End(xlUp).Row
> 'Hier Bereich anpassen
> For Each rngZelle In Range("A2:A" & LRow)
> Anz = Len(rngZelle) - Len(Replace(rngZelle, "(", ""))
> myString = ""
> For i = 1 To Anz
> Start = WorksheetFunction.Find("#", _
> WorksheetFunction.Substitute(rngZelle, "(", "#", i))
> myString = myString & Mid(rngZelle, Start + 1, 5) & ", "
> Next i
> rngZelle.Offset(0, 1) = myString
> Next rngZelle
>
> End Sub

oder so:
-----------------------------------------------------------------
Function ExtractNConcatEmbracedStuff(Phrase As String) As String

N = Len(Phrase)
S = ""

For i = 1 To N
If Mid(Phrase, i, 1) = "(" Then
j = i + 1
Do Until Mid(Phrase, j, 1) = ")"
S = S & Mid(Phrase, j, 1)
j = j + 1
Loop
S = S & ", "
i = j
End If
Next

ExtractNConcatEmbracedStuff = Left(S, Len(S) - 2)

End Function
-----------------------------------------------------------------
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2

Uwe_Lunkenbein

unread,
Jan 15, 2010, 2:25:12 PM1/15/10
to
Alexanders Funktion führte zum gewünschten Ergebnis. Habe erst später
festgestellt das die Anzahl der Zeichen innerhalb der Klammern
verschieden ist.

Vielen Dank euch allen

Peter Schleif

unread,
Jan 15, 2010, 2:37:21 PM1/15/10
to
Uwe_Lunkenbein schrieb am 15.01.2010 20:25 Uhr:
> Alexanders Funktion fᅵhrte zum gewᅵnschten Ergebnis. Habe erst spᅵter

> festgestellt das die Anzahl der Zeichen innerhalb der Klammern
> verschieden ist.

Hier noch eine etwas kᅵrzere Variante.

Peter

Function Klammerinhalt(sText As String) As String
Static regex As Object
If regex Is Nothing Then Set regex=CreateObject("VBScript.RegExp")
regex.Pattern = "[^(]*\(([^)]+)\)[^(]*"
regex.Global = True
Klammerinhalt = Mid(regex.Replace(sText, ",$1"), 2)
End Function

Alexander Wolff

unread,
Jan 15, 2010, 4:44:04 PM1/15/10
to

Die gefᅵllt mir sehr!

Bei meiner weniger schicken Version habe ich noch fᅵr
(2) nene () jaja (234)

die Ausgabe verbessert auf
2, 234

statt vorher
2, , 234

sowie eine verkᅵrzte innere Schleife (=Bottleneck) eingebaut:
------------------------------------------------------------------------


Function ExtractNConcatEmbracedStuff(Phrase As String) As String

For i = 1 To Len(Phrase)


If Mid(Phrase, i, 1) = "(" Then

For j = i + 1 To Len(Phrase)
If Mid(Phrase, j, 1) = ")" Then Exit For
Next
S = Replace(S & Mid(Phrase, i + 1, j - i - 1) & ", ", ", , ", ", ")


End If
Next
ExtractNConcatEmbracedStuff = Left(S, Len(S) - 2)
End Function

------------------------------------------------------------------------

Peter Schleif

unread,
Jan 16, 2010, 1:32:24 AM1/16/10
to
Alexander Wolff schrieb am 15.01.2010 22:44 Uhr:
>
> Bei meiner weniger schicken Version habe ich noch fᅵr
> (2) nene () jaja (234)
> die Ausgabe verbessert auf
> 2, 234

Ich auch :-) Deshalb arbeite ich gern mit regulᅵren Ausdrᅵcken: Meist
reicht es aus, das Muster anzupassen. Der Rest bleibt unverᅵndert.

regex.Pattern = ".*?\(([^()]+)\)[^(]*"


> sowie eine verkᅵrzte innere Schleife (=Bottleneck) eingebaut:

Die innere For-Schleife war IMHO auch nᅵtig. Do-Loop hatte sich bei mir
mit einem "wilden" Test-String totgelaufen (ᅵffnende Klammer am Schluss).

Peter

Alexander Wolff

unread,
Jan 16, 2010, 7:59:05 AM1/16/10
to

Das hatte ich gar nicht geprᅵft. Gut, dass jmd. "zerstᅵrerisch" prᅵft!

ᅵbrigens ist hier eine Ausnahme: Die innere Schleife wird gar nicht
(unbedingt) hᅵufiger durchlaufen, als die ᅵuᅵere. Denn i wird jeweils auf
den Endwert von j weitergestellt. Daher ist der Bottleneck nicht gravierend.
Die Verbesserung sorgt nur dafᅵr, dass der Rᅵckgabestring um jeweils erst
den ganzen Ausdruck ergᅵnzt wird, nicht schon zeichenweise.

Die RegEx-Syntax (fᅵr die Ausdrᅵcke) muss ich mir nochmal richtig anschauen.
Wahrscheinlich hᅵngt man doch irgendwo eine Kurz-Doku dafᅵr hin - oder
verlinkt auf eine.

0 new messages