Klammern samt Inhalt im String entfernen
#1
Hallo Freunde,

ich habe in einem String Klammern stehen, die ich samt deren Inhalt entfernen möchte. Mein kleines Makro funktioniert zwar, aber ich frage mich,
ob man dies nicht auch mit Wildcards machen kann und sich so Programmiercode ersparen könnte.



Code:
Sub Klammern_Mit_Inhalt_entfernen()
Dim vstrS
vstrS = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
vstrS = Split(vstrS)
For i = 1 To UBound(vstrS)
If InStr(vstrS(i), "[") Then vstrS(i) = ""
Next i
vstrS = Join(vstrS)
debug.print vstrS

End Sub
Top
#2
Hallo,

ich würde es so angehen:


Code:
Sub Klammern_Mit_Inhalt_entfernen()
Dim vstrS
Dim xStr
Dim i
vstrS = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
vstrS = Replace(vstrS, "[", "|")
vstrS = Replace(vstrS, "]", "|")
vstrS = Split(vstrS, "|")
For i = 0 To UBound(vstrS) Step 2
xStr = xStr & vstrS(i)
Next i


End Sub
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#3
Auch Hallo,

ich habe mich wieder an RegEx versucht (mieses pattern   Undecided ) .

Code:
Sub Klammern_Mit_Inhalt_entfernen()
   Dim vstrS
   Dim re As Object
   
   Set re = CreateObject("vbscript.regexp")
   vstrS = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
   re.Global = True
   re.Pattern = "(\[\w*\s+\w+\]\s)"
   vstrS = re.Replace(vstrS, "")
   Debug.Print vstrS

End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#4
Gibt's doch alles schon und deutlich universeller, Wulfi & Co:
A1: Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen.
Ergebnis: Die Klammern samt deren Inhalt entfernen.
aus Formel: =MaskOn(A1;"mrk[]";1)
Die UDF MaskOn von 2005 findest du im Herber-Archiv von 2014 in funktionsfähiger Form (Button RECHERCHE im Forum, dann oberste Eingabezeile im Suchmenü benutzen!).
Gruß, Castor
Top
#5
Hi Luc,

(31.05.2016, 02:41)Castor schrieb: Die UDF MaskOn von 2005 findest du im Herber-Archiv von 2014 in funktionsfähiger Form (Button RECHERCHE im Forum, dann oberste Eingabezeile im Suchmenü benutzen!).

ist das dann die:
Code:
Function MaskOn(ByVal Text As String, ByVal ZTyp As String, Optional ByVal ZTmask) As String
   Dim i As Integer, a As String, d As String, z As String, ZusZ As String
   Const b = "abcdefghijklmnopqrstuvwxyzäöü", c = "0123456789", e = " +-,.E " 'letztZ=Chr(160)
   If IsMissing(ZTmask) Then
       ZTmask = 1
   ElseIf IsNumeric(ZTmask) Then
       ZTmask = ZTmask Mod 2 + 1
   Else
       ZusZ = ZTmask: ZTmask = 1
   End If
   For i = 1 To Len(Text)
       Select Case lcase(Left(ZTyp, 3))                            'feste ZKomb in ZTyp
       Case "gkz", "buz", "bz", "bzi", "len", "lin", "a0", "an", "anu"
           a = c & b & "ß": z = lcase(Mid(Text, i, 1))
       Case "gk", "gkb", "bst", "buc", "let", "lit"
           a = b & "ß": z = lcase(Mid(Text, i, 1))
       Case "kb", "mil", "min"
           a = b & "ß": z = Mid(Text, i, 1)
       Case "gb", "cal", "cap"
           a = UCase(b): z = Mid(Text, i, 1)
       Case "zf", "dg", "zif", "dig", "num", "00", "000"
           a = c: z = Mid(Text, i, 1)
       Case "zw", "nv", "zah", "zwt", "nvl", "+0", "0.-"
           a = c & e: z = Mid(Text, i, 1)
       Case "mar", "mrk", "mkt", "mtx"
           z = Mid(Text, i, 1)
           If z = Left(Right(ZTyp, 2), 1) Then
               a = z: d = z
           ElseIf z = Right(ZTyp, 1) Then
               a = z: d = z
           ElseIf d = Left(Right(ZTyp, 2), 1) Then
               a = z
           Else: a = ""
           End If
       Case Else                                                   'freie ZKomb in ZTyp
           a = ZTyp: z = Mid(Text, i, 1)
       End Select
       a = a & ZusZ
       On Abs(CInt(InStr(a, z) > 0)) + ZTmask GoSub lm, zm, lm
   Next i
   MaskOn = WorksheetFunction.Substitute(Trim(MaskOn), "  ", " ")
   Exit Function
lm: Rem reduziert maskierte Zeichen (mehrere hintereinander als 1 blank)
   MaskOn = MaskOn & IIf(Right(MaskOn, 1) = " ", "", " ")
   Return
zm: Rem übernommene Zeichen
   MaskOn = MaskOn & Mid(Text, i, 1)
   Return
End Function

aus diesem Link:
http://www.herber.de/forum/archiv/1344to...344962.htm

mit dieser Anleitung vom 14.01.2014?
1. alle GBuchstaben, 2. maximal 3 GB'n, 3. stets 3 Buchstaben (ggf um letzten B'st des Nachnamens ergänzt)
Nebenbei, da irrelevant, ist die hier benutzte Version (2.9) ist die hier (Hilfe zu AddIn FXss) beschriebene:
MaskOn ( Text; ZTyp; ZTmask=0; ErsZ=blank )
Ergebnis: Listentext, Zeichenfolge oder Zahl
Erzeugt redu­zierte Zeichenfolge als Listen­text über Maske laut Arg2 mit Einzel­blanks als Ersatz-/Trennzeichen
Arg2.1: anu=alf+nume­risch alf=Buch­stabe kb=Klein­buch­stabe gb=Groß­buch­stabe num=Ziffer zw=Zahlen­werte
Arg2.2: hex=Hexadezimal­zahlen ad=Zell­adresse mar‘’=Markie­rung ‘…’ [‘’=belie­bige diffe­rente Zei­chen ]
Arg2.3: belie­bige direkt einge­tragene Zeichen/kombi­nation (freie Zeichen­kombi­nation hier ggw nicht möglich)
Arg3: 0 [1 ] *nur [ohne ] Zeichen laut Arg2 oder zusätz­lich zu belas­sende Zeichen (implizit 0)
Arg4: fehlt/leer/beliebiges nicht in Arg1 enthaltenes Zeichen

Bsp1: a) M =MaskOn("5 Mann";"gb"), b) , % =MaskOn("1,6%";"num";1), c) 2,52 =MaskOn("zu 2,52 Euro";"zw")
Bsp2: a) F0 =MaskOn("F0 byte";"hex"), b) A$1:IV1 =MaskOn("Sum(A$1:IV1)";"ad"), c) Sum =MaskOn("Sum(A:A)";"mar()";1)
Bsp3: a) a b c =MaskOn("(a+b)*c";"( + * )";1), b) a W n =MaskOn("alle Wellen";"el";1), c) lle el =MaskOn("alle Welt";"el")
Hinweis: Im Falle von Arg2="ad" ist in Arg3 nur ein Ein­zel­zei­chen, keine Folge ein­zel­ner zusätz­lich zu bewah­ren­der Zei­chen wie in allen ande­ren Fäl­len zuläs­sig. Außer­dem muss es unmit­tel­bar vor einer erkenn­baren Zell­adresse in Arg1 auf­treten. Falls hier der soge­nannte Schnitt­men­gen­ope­ra­tor (Leer­zei­chen) auf­tre­ten kann, sollte(n) ggf (ein) ande­re(s) Zei­chen für Arg4 gewählt werden.
Achtung! Von die­ser Ver­sion wer­den keine Z1S1- und Adres­sen ober­halb von IV65536 (xlVer­sio­nen ab 12) erkannt!
Vs 2.9b -Autor: LSr -1Pub:(2.1) 20050217 herber.de -CDate: 2004/5 -LUpd: 20100206n
   

Ist aber gar nicht so einfach zu finden, wie Du schreibst!
Top
#6
Hallo,

oder einfach mit Suchen/Ersetzen in Excel:

Code:
Sub Klammern_Mit_Inhalt_entfernen()
 Dim vStr As String
 vStr = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
 Application.ScreenUpdating = False
 With Workbooks.Add(xlWBATWorksheet).Sheets(1).Cells(1)
   .Value = vStr
   .Replace What:= "[*]", Replacement:="", _
             LookAt:=xlPart, MatchCase:=False, _
             SearchFormat:=False, ReplaceFormat:=False
   vStr = .Value
   .Parent.Parent.Close False
 End With
 Application.ScreenUpdating = False
 Debug.Print vStr
End Sub
[*]

Gruß Uwe
Top
#7
Hi,

bei Edgars und Uwes Makros sind zu viel Leerzeichen im Ergebnis-String!
Top
#8
Hi Ralf,

(31.05.2016, 09:07)Rabe schrieb: Hi,

bei Edgars und Uwes Makros sind zu viel Leerzeichen im Ergebnis-String!

das war zwar bei der Ursprungsfrage kein Thema, aber nun mit drin:

Code:
Sub Klammern_Mit_Inhalt_entfernen_Kuwer()
 Dim vStr As String
 vStr = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
 Application.ScreenUpdating = False
 With Workbooks.Add(xlWBATWorksheet).Sheets(1).Cells(1)
   .Value = vStr
   .Replace What:="[*]", Replacement:="", _
             LookAt:=xlPart, MatchCase:=False, _
             SearchFormat:=False, ReplaceFormat:=False
   vStr = Application.Trim(.Value)
   .Parent.Parent.Close False
 End With
 Application.ScreenUpdating = False
 Debug.Print vStr
End Sub
[*]

Gruß Uwe
Top
#9
Hallo Leute,

warum nicht einfach mit einer Hilfszelle. Es werden schon nicht alle 16,7 Milliarden Zellen eines Tabellenblattes besetzt sein.


Code:
Sub Die_Hilfszelle()
Dim vstr
vstr = "Die Klammern [Info 1] samt [Info 2] deren Inhalt [Info 3] entfernen."
Cells(Rows.Count, Columns.Count) = vstr
Cells(Rows.Count, Columns.Count).Replace " [*] ", " "
vstr = Cells(Rows.Count, Columns.Count)
Debug.Print vstr
End Sub
Top
#10
Ja, RaBe,
du hast's gefunden! Von leicht habe ich hier allerdings nichts geschrieben, weil es inzwischen sehr viele Erwähnungen dieser UDF im dortigen und auch anderen Archiven gibt; ist ja immerhin schon 11 Jahre alt! Und Google zeigt auch nicht immer die Treffer in chronologischer Reihenfolge.
Übrigens, Probleme mit überzähligen Leerzeichen gibt's bei MaskOn nicht, die wdn alle auf eines reduziert und am Satz-/Wort-Anfang/-Ende eliminiert.
Gruß, L.A.Castor
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste