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
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
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
..schön, dass Du Deine Aufgabe so exakt beschreibst. Macht richtig
Spaß!
Helmut
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
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
Vielen Dank euch allen
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
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
------------------------------------------------------------------------
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
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.