String auseinanderreißen

  • Excel

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Artifi.

    String auseinanderreißen

    Hab in einer Zelle/Spalte (A) mehrere Wörter stehen die durch ein Leerzeichen getrennt sind, kann kein Leerzeichen enthalten, eins oder mehrere:

    Montag Dienstag Mittwoch

    Die will ich jetzt auf mehrere Zellen/Spalten (B, C, D, etc.) verteilen.

    Muss ja irgendwie so gehen:

    Visual Basic-Quellcode

    1. Sub Expand()
    2. Dim Zelle As Range
    3. Dim i As Integer
    4. i = 1
    5. Set Zelle = Worksheets("EinExpand").Range("A:A")
    6. For Each Zelle In Selection
    7. Do until (kein Leerzeichen mehr gefunden), ansonsten i = i +1
    8. Zelle.Offset(0, i).Value = Mid(Zelle.Value, InStr(Zelle.Value, " ") + 1, (Len(Zelle.Value) - InStr(Zelle.Value, " ")))
    9. Loop
    10. Next Zelle
    11. End Sub


    Wie genau ist es richtig?
    Ich denke der einfachste Ansatz ist via Split:

    Visual Basic-Quellcode

    1. Dim s As String
    2. s = "MITTWOCH DIENSTAG MON GER TREI DSS"
    3. Dim sAr() As String
    4. sAr = Split(s, " ")
    5. For a = 0 To UBound(ss)
    6. If Len(sAr(a)) > 0 Then
    7. Debug.Print (sAr(a))
    8. End If
    9. Next


    Nun musst du eigentlich nur noch die Strings in eine Zelle eintragen und die Spalte dabei hochzählen.

    Ciao
    Das ist meine Signatur und sie wird wunderbar sein!
    Dein Beispiel funktioniert leider nicht.

    Visual Basic-Quellcode

    1. Sub sching()
    2. Dim s As String
    3. Dim sAr() As String
    4. Dim a As Integer
    5. s = "MITTWOCH DIENSTAG MON GER TREI DSS"
    6. sAr = Split(s, " ")
    7. For a = 0 To UBound(s)
    8. If Len(sAr(a)) > 0 Then
    9. Debug.Print (sAr(a))
    10. End If
    11. Next
    12. End Sub


    Erwartet Datenfeld.

    Ja, wie geht bloss der Rest? Dachte mit Do Until/While Loop, bei jedem Leerzeichen wird i um eins erhöht.
    Du solltest schon Split() nehmen. Alles andere is Murks.
    in Zeile 8 hast du ein Arry mit all deinen einzelnen Wörtern.
    Also musst du nun nur noch dein Array durchlaufen und die einzelnen Werte in einen .Offset zu deinem aktuellen Range schreiben
    Wobei die Zuordnung in VBA von .Split nicht mit () erfolgt.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub test()
    3. Dim i, j As Integer
    4. j = 0
    5. Dim a As Range
    6. Set a = ActiveSheet.Range("A1")
    7. Dim s As String
    8. s = "Hallo Montag Dienstag Mitt Frei grün"
    9. Dim arS
    10. arS = Split(s) 'ohne Zusatz wird direkt am Leerzeichen gesplittet; aber Vorsicht die Leerzeichen dazwischen werden dann auch zu Items im Array
    11. For i = 0 To UBound(arS)
    12. If Not arS(i) = "" Then 'deshalb hier die Abfrage ob das aktuelle Element auch Daten enthält
    13. a.Offset(0, j) = arS(i) 'und entsprechend hier das schreiben über eine Hilfvariable, da die Ausgabe sonst ja leere Spalten enthält
    14. j = j + 1
    15. End If
    16. Next i
    17. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    Du solltest schon .Split nehmen. Alles andere is Murks.

    Oo Vba

    Visual Basic-Quellcode

    1. arS = Split(s)


    Du musst schon das Zeichen angeben, nach welchem gesplittet werden soll.
    Ist offenbar der Defaultwert wenn man nichts angibt, sollte man m.E. dennoch angeben :p

    Visual Basic-Quellcode

    1. Dim arS


    Nur weil es VBA ist, sollte man nicht auf Typendeklaration verzichten.
    Das ist meine Signatur und sie wird wunderbar sein!
    @Mono Du kannst die Zuordnung von Split nich in ein Array() vornehmen in VBA! --> Laufzeitfehler'13' Typen unverträglich
    Du könntest es als Variant definieren, das macht allerdings in m.E. in diesem fall keinen sinn.
    und der .Split Funktion braucht keinen Delimiter! wenn keiner angegeben is is der automatisch das Leerzeichen.
    Erst lesen und wissen! Bevor man schreibt!
    Schau es dir einfach an!
    @xtts02 Sry.. der hat sich da fälschlicherweise eingeschlichen ..werds ändern
    Danke, das hat für diesen String funktioniert. Allerdings stehen die ganzen Strings in Spalte A und sollen auf B bis ... aufgeteilt werden. Heißt also s = Inhalt jeder Zelle von a und j fängt mit 1 an. Kann ich s also einfach den Zelleninhalt zuweisen?
    ja kannst du... packst das ganze halt in ne schleife wo du die spalte A nach unten läufst...
    un ordnest s immer den wert aus spalte a zu...
    un das Ziel musste halt dann anpassen....
    like:

    Visual Basic-Quellcode

    1. For Each Zelle In Range("A1:A10")
    2. 'der Code halt
    3. arS = Split(Zelle)
    4. 'usw...
    5. Zelle.offset(0,j) = .... 'j halt oben nich mit 0 initialisieren sondern mit 1
    6. '...
    7. next
    Fast perfekt nur sollte j bei jeder Zeile wieder bei 1 beginnen. Denn jetzt geht das immer weiter auseinander, heißt Zelle A1 wird auf B1 und C1 aufgeteilt, Zelle A2 jedoch bei D2 und nicht bei B2, am Ende bin ich also irgendwo bei ZZ, wird also eine schräge Linie.

    Sowas wie falls die Zeile noch die gleiche ist dann j = j + 1 ansonsten j = 1?
    Bissl selber mitdenken kann nicht schaden..

    Visual Basic-Quellcode

    1. dim j as integer
    2. For Each Zelle In Range("A1:A10")
    3. 'der Code halt
    4. 'Anfang setzen
    5. j=1
    6. arS = Split(Zelle)
    7. For a=0 to Ubound(arS)
    8. 'usw...
    9. Zelle.offset(0,j) = .... 'j halt oben nich mit 0 initialisieren sondern mit 1
    10. '...
    11. j = j + 1
    12. Next
    13. next
    Das ist meine Signatur und sie wird wunderbar sein!
    Im Endeffekt will ich nur bei meinem alten Problem der Berufskodierung weiterkommen. Dachte vielleicht hilft es wenn ich die langen Strings auseinanderreiße und nur die Bruchstücke miteinander vergleiche. So richtig weiter weiß ich allerdings auch nicht mehr. Schön wär es jetzt in jeder dieser neu kreierten Zellen nach "/", "-", "(", ")" etc. zu suchen und diese ersatzlos zu streichen, sowie alles was hinter dem "/" steht.
    War ganz einfach bis jetzt:

    Zelle = Replace(Zelle, "(", "")

    Nur bei "/" wird es komplizierter.

    Wenn vor oder nach dem / nichts steht dann löschen.

    /bla = bla
    bla/ = bla
    / =

    Wenn danach nur ein Buchstabe kommt, dann auch streichen.

    bla/b = blab

    Wenn danach § kommt dann so lassen

    bla/§23

    Wenn danach mehr als ein Buchstabe kommt dann / und alle Buchstaben danach löschen aber nur wenn es vor dem / auch Buchstaben gibt sonst gilt das obige

    bla/blupp = bla
    /bla = bla
    /blupp = blupp