Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Text im Text entfernen

Forumthread: Text im Text entfernen

Text im Text entfernen
02.02.2017 20:32:03
Erwin
Hallo,
suche eine VBA-Funktion, die aus folgendem Beispieltext:
"A TXT 123123, A TXT's berechnen, A TXT 0815, A TXT 4, A TXT ist grün, A TXT 745"
alles entfernt, was so aufgebaut ist:
A TXT #
A TXT =konstant
#=beliebiege Zahl
zwischen A TXT und Zahl ist immer ein Leerzeichen
also in diesem Beispiel dieses entfernen:
A TXT 123123, A TXT 0815, A TXT 4 und A TXT 745
damit folgendes übrigbleibt:
A TXT's berechnen, A TXT ist grün
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Text im Text entfernen
02.02.2017 20:58:06
Daniel
Hi
über einfache VBA-Grundfunktionen so, es müssen aber immer Ganzzahlen sein, ohne Komma und ohne Tausenderpunkt
Sub test()
Dim txt1 As String
Dim txt2 As String
Dim TT
txt1 = "A TXT 123123, A TXT's berechnen, A TXT 0815, A TXT 4, A TXT ist grün, A TXT 745"
For Each TT In Split(txt1, ", ")
If Not TT Like "A TXT " & String(Len(TT) - Len("A TXT "), "#") Then txt2 = txt2 & ", " & TT
Next
txt2 = Mid(txt2, 3)
MsgBox txt1 & vbLf & txt2
End Sub
Gruß Daniel
Anzeige
AW: Text im Text entfernen
02.02.2017 21:13:15
Erwin
Danke Daniel,
beliebige Zahl ist immer eine Ganzzahl,
funktioniert gut.
Gruß Erwin
Nebenbei, für UDF-/Formel-Interessenten!
03.02.2017 01:24:36
Luc:-?
Eine MatrixFml mit UDF-Unterstützung könnte für das konkrete Bsp (mit 6 TeilTexten) so aussehen:
{=VJoin(WENN(TxEval(WECHSELN("VLike(index("&VJoin(VSplit(A1;", ");",;";2)&",@),""A TXT #*"")";"@"; ZEILE(A1:A6)));"";VSplit(A1;", "));", ";-1) }
Für beliebig viele TeilTexte eher so:
{=VJoin(WENN(TxEval(WECHSELN("VLike(index("&VJoin(VSplit(A1;", ");",;";2)&",@),""A TXT #*"")";"@"; ZEILE(INDIREKT("A1:A"&ANZAHL2(VSplit(A1;", "))))));"";VSplit(A1;", "));", ";-1) }
Bezogen auf einen GesamtText in A1. Das ist aber auch einfacher möglich, wenn zusätzlich MTRANS eingesetzt wird (muss wohl noch ein „Horizontal-bug“, der beim Auswerten des FmlTextes wg INDEX nicht auftreten kann, in der UDF stecken):
{=VJoin(WENN(VLike(MTRANS(VSplit(I14;", "));"A TXT #*");"";MTRANS(VSplit(I14;", ")));", ";-1)}
UDF-Links:
TxEval: https://www.herber.de/cgi-bin/callthread.pl?index=1476498#1477400
VJoin & VSplit: https://www.herber.de/bbs/user/99024.xlsm
Da der Thread von 2012 mit dem Pgm von VLike beim Archiv-Umbau 2016 verloren gegangen zu sein scheint, nutze ich die Gelegenheit und poste ihn hier erneut:
Rem Mxfmlfäh udFkt vgleicht Arg1 m.Suchmaske(Arg2) u.liefert Ergeb lt Arg3
'   Arg3=0(fehlt)->Wahrheitswt, =-1/+1->Anfangs-/EndPosition d.letzt Arg1-
'   TeilZeichenkette, f.d.sich noch 1 Vgl-Treffer ergibt. Mehr als 1 Tref-
'   fer liegt vor, falls Anfangs- > EndPosition ist! Arg2/3 müssen Skalare
'   sein or Arg1-Dimension haben, wobei Arg1 dann nur Vektor sein darf. In
'   dsn Fällen wird udFkt VPairs benötigt ->ggf d.PgmTeil auskommentieren!
'   Wn Arg1 Skalar ist, darf Arg2 ODER Arg3 ebenfalls beliebg Vektor sein.
'   Vs1.3 -LSr.CyWorXxl -cd: 20120121 -fpub: 20120124 herber.de -lupd: 20160803n
Function VLike(ByVal Bezug, ByVal TxMaske, Optional ByVal TxPosit = 0)
Dim cix As Long, lb(1) As Long, pix As Long, rix As Long, ub(1) As Long, _
lm(1) As Long, lp(1) As Long, um(1) As Long, up(1) As Long, _
hVkt(2) As Boolean, avBez, erg(), txm, txp, xB As Variant
On Error Resume Next
If IsArray(TxMaske) Then
If TypeName(TxMaske) = "Range" Then
VLike = CVErr(xlErrRef)
With WorksheetFunction
TxMaske = .Transpose(.Transpose(TxMaske.Value2))
End With
Else: VLike = CVErr(xlErrNum)
End If
If IsError(LBound(TxMaske, 2)) Then
hVkt(1) = True: lm(0) = LBound(TxMaske): um(0) = UBound(TxMaske)
If um(0) - lm(0) = 0 Then txm = TxMaske(lm(0)) _
Else txm = TxMaske
Else: lm(0) = LBound(TxMaske, 2): um(0) = UBound(TxMaske, 2)
lm(1) = LBound(TxMaske, 1): um(1) = UBound(TxMaske, 1)
If um(0) - lm(0) = 0 Then
If um(1) - lm(1) = 0 Then txm = TxMaske(lm(1), lm(0)) _
Else txm = TxMaske
Else: Exit Function
End If
End If
Else: txm = TxMaske
End If
If IsArray(TxPosit) Then
If TypeName(TxPosit) = "Range" Then
VLike = CVErr(xlErrRef)
With WorksheetFunction
TxPosit = .Transpose(.Transpose(TxPosit.Value2))
End With
Else: VLike = CVErr(xlErrNum)
End If
If IsError(LBound(TxPosit, 2)) Then
hVkt(2) = True: lp(0) = LBound(TxPosit): up(0) = UBound(TxPosit)
If up(0) - lp(0) = 0 Then txp = TxPosit(lp(0)) _
Else txp = TxPosit
Else: lp(0) = LBound(TxPosit, 2): up(0) = UBound(TxPosit, 2)
lp(1) = LBound(TxPosit, 1): up(1) = UBound(TxPosit, 1)
If up(0) - lp(0) = 0 Then
If up(1) - lp(1) = 0 Then txp = TxPosit(lp(1), lp(0)) _
Else txp = TxPosit
Else: Exit Function
End If
End If
Else: txp = TxPosit
End If
If IsArray(Bezug) Then
If TypeName(Bezug) = "Range" Then
With WorksheetFunction
avBez = .Transpose(.Transpose(Bezug.Value2))
End With
Else: avBez = Bezug
End If
If IsError(LBound(avBez, 2)) Then
lb(0) = LBound(avBez): ub(0) = UBound(avBez)
hVkt(0) = True: ReDim erg(ub(1) - lb(1))
ElseIf IsArray(txm) Or IsArray(txp) Then
If UBound(avBez, 2) - LBound(avBez, 2) = 0 Then
ReDim erg(UBound(avBez, 1) - LBound(avBez, 1), 0)
Else: VLike = CVErr(xlErrRef): Exit Function
End If
Else: lb(0) = LBound(avBez, 2): ub(0) = UBound(avBez, 2)
lb(1) = LBound(avBez, 1): ub(1) = UBound(avBez, 1)
ReDim erg(ub(1) - lb(1), ub(0) - lb(0))
End If
If IsArray(txm) And IsArray(txp) Then
Exit Function
For Each xB In VPairs(avBez, txm, txp)
If Not IsNumeric(xB(2)) Then
TxPosit = CInt(CBool(InStr(xB(2), "-"))) - CInt(CBool(InStr(xB(2), "+")))
Else: TxPosit = Sgn(xB(2))
End If
Bezug = xB(0): TxMaske = xB(1)
VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next xB
ElseIf IsArray(txm) Then
Exit Function
If Not IsNumeric(txp) Then
TxPosit = CInt(CBool(InStr(txp, "-"))) - CInt(CBool(InStr(txp, "+")))
Else: TxPosit = Sgn(txp)
End If
For Each xB In VPairs(avBez, txm)
Bezug = xB(0): TxMaske = xB(1)
VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next xB
ElseIf IsArray(txp) Then
Exit Function
TxMaske = txm
For Each xB In VPairs(avBez, txp)
If Not IsNumeric(xB(1)) Then
TxPosit = CInt(CBool(InStr(xB(1), "-"))) - CInt(CBool(InStr(xB(1), "+")))
Else: TxPosit = Sgn(xB(1))
End If
Bezug = xB(0): VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next xB
Else: TxMaske = txm
If Not IsNumeric(txp) Then
TxPosit = CInt(CBool(InStr(txp, "-"))) - CInt(CBool(InStr(txp, "+")))
Else: TxPosit = Sgn(txp)
End If
For Each Bezug In avBez
VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next Bezug
End If
VLike = erg
ElseIf IsArray(txm) And IsArray(txp) Then
Exit Function
ElseIf IsArray(txm) Then
If Not hVkt(1) Then
ReDim erg(um(1) - lm(1), um(0) - lm(0))
Else: ReDim erg(um(0) - lm(0))
End If
If Not IsNumeric(txp) Then
TxPosit = CInt(CBool(InStr(txp, "-"))) - CInt(CBool(InStr(txp, "+")))
Else: TxPosit = Sgn(txp)
End If
avBez = Bezug: hVkt(0) = hVkt(1)
lb(0) = lm(0): ub(0) = um(0): lb(1) = lm(1): ub(1) = um(1)
For Each TxMaske In txm
VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next TxMaske
VLike = erg
ElseIf IsArray(txp) Then
If Not hVkt(2) Then
ReDim erg(up(1) - lp(1), up(0) - lp(0))
Else: ReDim erg(up(0) - lp(0))
End If
avBez = Bezug: hVkt(0) = hVkt(2)
lb(0) = lp(0): ub(0) = up(0): lb(1) = lp(1): ub(1) = up(1)
For Each TxPosit In txp
If Not IsNumeric(TxPosit) Then
TxPosit = CInt(CBool(InStr(TxPosit, "-"))) - CInt(CBool(InStr(TxPosit, "+")))
Else: TxPosit = Sgn(TxPosit)
End If
VLike = IIf(CBool(TxPosit), 0, False): GoSub ew
Next TxPosit
VLike = erg
Else: TxMaske = txm
If Not IsNumeric(txp) Then
TxPosit = CInt(CBool(InStr(txp, "-"))) - CInt(CBool(InStr(txp, "+")))
Else: TxPosit = txp
End If
ew:     If IsError(Bezug) Then
VLike = Bezug
ElseIf Bezug Like TxMaske Then
Select Case TxPosit
Case -1
For pix = 1 To Len(Bezug)
If Not Mid(Bezug, pix) Like TxMaske Then Exit For
Next pix
VLike = pix - 1
Case 0: VLike = True
Case 1
For pix = Len(Bezug) To 1 Step -1
If Not Left(Bezug, pix) Like TxMaske Then Exit For
Next pix
VLike = pix + 1
End Select
ElseIf TxPosit = 0 Then
VLike = False
End If
If Not IsEmpty(avBez) Then
If Not hVkt(0) Then
erg(rix, cix) = VLike
rix = (rix + 1) Mod (ub(1) + 1 - lb(1))
cix = cix - CInt(rix = 0)
Else: erg(cix) = VLike: cix = cix + 1
End If
Return
End If
End If
End Function
Gruß, Luc :-?
Besser informiert mit …
Anzeige
Jetzt habe ich doch noch das Original VLike ...
03.02.2017 02:05:48
Luc:-?
…gefunden: https://www.herber.de/cgi-bin/callthread.pl?index=1247144#1247699
Hier sind die VPairs betreffenden Zeilen bereits auskommentiert. Für diesen Fall fktioniert das aber trotzdem (mit gleichem bug).
Luc :-?
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige