Clever-Excel-Forum

Normale Version: Fortgeschrittenes VBA: String "zerschneiden"
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo, 19 

bei Stringmanipulationen nutze ich gerne REGEXP: 21
[attachment=39869]

In neueren Excelversionen wird mit dynamischen Arrays gearbeitet. In deiner Version wirst du noch einen Bereich markieren müssen und dann die Formel eingeben und mit STRG+UMSCHALT+RETURN abschließen. Confused
Und nun ein echtes, repräsentatives Beispiel.
Hallo, 19 

bevor es wieder Schnappatmung gibt - das geht auch kürzer. Einen Kurzen mag ich aber eher im Glas. Dodgy
[attachment=39871]

Auch hier könnte man in der UDF ein Array bilden bzw. beide in eine Funktion packen. 21
Hi zusammen,
vielen Dank für die tollen Funktionen. Hatte gar nicht mehr auf dem Schirm, dass man eigene Funktionen definieren kann.
Leider scheitere ich gerade noch daran das zu kombinieren mit der Funktionalität, die Zwenn schon mal in seiner Lösung drin hatte: Nämlich, dass ich automatisch (am besten via Button-Press) einen gegebenen, noch deutlich längeren String, durchschaue und alle Ergebnisse wie im Bsp. unter- und nebeneinander schreibe.
Es fehlt also quasi noch eine Auslösefunktion (Button) und eine Schleife, die ständig prüft, den String dann reduziert und die erfolgreichen Funde in Zellen schreibt.
VG
Hallo, 19 

schreibe doch einfach eine Sub und rufe darin die Funktion auf. Lege das auf einen Button und fertig. 21

Wenn du das nicht hinbekommst, dann lade eine aussagekräftige Beispieldatei hier hoch und ich schau mir das an. Dodgy
Hallo Case,
Button erstellen, Funktion aufrufen und auch eine Schleife sind grundsätzlich klar.
Ich scheitere aber gerade noch daran, den Gesamtstring sinnvoll zu "zerschneiden" und je Schleifendurchlauf nur das "Übrige" an die Funktion zu schicken.
Vielleicht kannst du einen Blick drauf werfen. Anbei das Grundgerüst. 
VIELEN DANK! :)
Hallo, 19 
das geht doch mit der UDF - egal wieviel Banken im String sind: 21
Code:
Option Explicit
Public Function fncBank(ByVal strTMP As String, Optional lngTMP As Long = 0, Optional lngZ As Long = 0) As Variant
    fncBank = IIf(lngZ = 0, Split(Split(strTMP, "<Bank>")(lngTMP + 1), "</Bank>")(0), Split(Split(strTMP, "<Bankleitzahl>")(lngTMP + 1), "</Bankleitzahl>")(0))
End Function
Als Formel dann in z. B. B5...
Code:
=WENNFEHLER(fncBank($B$2;SPALTE(A1)-1);"")
... und nach rechts ziehen.
Bzw. für die Bankleitzahl dann in B6...
Code:
=WENNFEHLER(fncBank($B$2;SPALTE(A1)-1;1);"")
... und auch nach rechts ziehen.
Wenn du es als Sub möchtest (in meinem Beispiel stehen die Strings ab A1 folgende): 21
Code:
Option Explicit
Public Sub Main()
    Dim lngLastRow As Long
    Dim lngCount As Long
    Dim lngTMP As Long
    Application.ScreenUpdating = False
    lngTMP = 1
    With Tabelle1
        For lngLastRow = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
            If .Cells(lngLastRow, 1).Value Like "*<Bank>*" Then
                lngCount = .Evaluate("=SUM((LEN(A" & lngLastRow & ")-LEN(SUBSTITUTE(A" & lngLastRow & ",""</Bankleitzahl>"","""")))/LEN(""</Bankleitzahl>""))")
                For lngCount = 1 To lngCount
                    .Cells(lngLastRow, lngTMP + 1).Value = Split(Split(.Cells(lngLastRow, 1).Value, "<Bank>")(lngCount), "</Bank>")(0)
                    lngTMP = lngTMP + 1
                    .Cells(lngLastRow, lngTMP + 1).Value = Split(Split(.Cells(lngLastRow, 1).Value, "<Bankleitzahl>")(lngCount), "</Bankleitzahl>")(0)
                    lngTMP = lngTMP + 1
                Next lngCount
            End If
            lngTMP = 1
        Next lngLastRow
    End With
    Application.ScreenUpdating = True
End Sub
Jetzt sollte es eigentlich klar sein.
{} bedeutet Formelarray! Folgende Formel ist ab xl2013 möglich. {B4:F7:}

=INDEX(GLÄTTEN(XMLFILTERN("<a><b>"&WECHSELN(WECHSELN(WECHSELN(B2;"<";" ");">";" ");" ";"</b><b>")&"</b></a>";"//b"));ZEILE(1:4)*20-{17.13.9.5.1})

Quellhinweis: shift-del spürte die geniale XMLFILTERN-(als-SPLIT)-Verwendung von rhockman auf.
Oder:

Code:
Sub M_snb()
  sn = Tabelle1.Cells(1).CurrentRegion
 
  For j = 1 To UBound(sn)
    st = Split(Replace(Replace(Join(Filter(Split(sn(j, 1), "<"), "Bank"), ""), "Bank>", ""), "Bankleitzahl>", ""), "/")
    Tabelle1.Cells(j, 2).Resize(, UBound(st)) = st
  Next
End Sub
Seiten: 1 2