none
Text in Spalten aufteilen mit max. 40 Zeichen je Zelle, ohne Woerter zu teilen

    Frage

  • Hallo Community

    Mein Problem ist folgendes: Ich habe viele lange Texte von jeweils ca. einer DinA4 Seite. Jeder Text ist in einer seperaten Excel-Datei. Ich möchte ein VBA-Makro schreiben, mit dem ich jeden der Texte in Spalten aufteilen kann und zwar mit einer maximalen Zeichenlänge von 40 Zeichen je Zelle und ohne dabei Wörter "zu zerreissen". Stapelverarbeitung, dass alle Dateien hintereinander auf gleiche Weise bearbeitet werden, muss erstmal noch gar nicht sein.

    =============================================
    Dummybeispiel:

    Input:
    Zelle A1: "Dies ist ein Text mit vielen Wörtern, den ich nach jeweils 40 Zeichen trennen möchte, ohne dass Wörter zerreissen werden."

    Gewünschter Output:
    Zelle A2: "Dies ist ein Text mit vielen Wörtern, den ich nach"
    Zelle A3: "jeweils 40 Zeichen trennen möchte, ohne dass"
    Zelle A4: "Wörter zerreissen werden."

    Erklärung: Für den Beispielsatz wäre die erste Trennung nach genau 40 Zeichen nach dem Wort "nach". Die zweite Trennung würde nach 39 Zeichen stattfinden, weil sonst das Wort "Wörter" zerrissen würde. Für den Rest des Satzes erfolgt keine Trennung mehr.
    =============================================

    Ich bin neu in VBA, habe aber gewisse Programmiererfahrung. Die Google-Suche habe ich natürlich schon extensiv verwendet. Leider habe ich keine Diskussionen mit genügend ähnlichen Fragen gefunden, als dass ich dortige Lösung hätte adaptieren können. Folgende Diskussionen scheinen Teillösungen zu bieten:

    • VBA-Makro zum Aufteilen von Text in unterschiedliche Zeilen: http://www.herber.de/forum/archiv/304to308/307714_Text_in_Zeilen.html
    • Zelle nach 50 Zeichen an Leerzeichen trennen und in 2 Zellen ausgeben (Rudis Beitrag): http://www.herber.de/forum/archiv/1088to1092/1091643_Zellen_trennen_nach_X_Zeichen_an_Leerzeichen.html

    Bin um jede Hilfe froh. Sollte sich jemand die Mühe machen, ein Makro zu schreiben, das mir hilft, würde ich mich besonders über eine Auskommentierung der kritischen Codezeilen freuen - weils so ungemein beim Verständnis und Erlernen hilft.

    Herzliche Grüsse
    Joe



    Donnerstag, 6. Dezember 2018 12:38

Antworten


  • Hallo Dank Peter

    Vielen Dank für deine Hilfestellung. Genau weil ich nicht so "einfach" eine Methode schreiben kann, habe ich ja um hilfe gefragt. Letztlich hat mich deine Hilfestellung aber zum Ziel geführt. Elegante Idee deinerseits, alle Zeichen durchzugehen und per If-Abfrage nach jedem Leerzeichen den jeweiligen Textteil zu verarbeiten.

    Den einzigen "Fehler", den ich in deinem Code gefunden habe war, dass du die Leerzeichen nicht mitgezählt hattest, wenn es darum ging nach einem überprüften Leerzeichen das letzte Zeichen des momentanen Teiltextes festhalten (i3=i1+1).

    Ansonsten habe ich nur noch die relevanten Zeilen kommentiert und eingebaut, dass der Text jeweils in untereinander liegende Zeilen eingesetzt wird.

    Das hier ist meine kommentierte Lösung

    Sub ZeilenTrennenNach40Zeichen() Dim txt As String txt = Range("A1").Value Dim zeichen As Integer Dim startTeiltext As Integer Dim endeTeiltext As Integer

    'Laufvariablen zum Speichern der einzelnen Zeilen bereitstellen Dim spalte As Integer Dim zeile As Integer spalte = 1 zeile = 3

    'Hilfsvariablen für Schleife bereitstellen zeichen = 0 startTeiltext = 1 endeTeiltext = 1 'Schleife über gesamten Text For zeichen = 1 To Len(txt) 'Bei jedem Leerzeichen anhalten und prüfen, ob der aktuelle Teil des Textes über 40 Zeichen hat. If Mid(txt, zeichen, 1) = " " Then If zeichen - startTeiltext >= 40 Then 'Teiltext in Excel einfügen
    ActiveSheet.Cells(zeile, spalte).Value = Trim(Mid(txt, startTeiltext, endeTeiltext - startTeiltext)) 'Immer wenn Text geschrieben wurde den Zeilen-counter hochstellen
            'und das Startzeichen für den nächsten Teiltext festlegen
    zeile = zeile + 1 startTeiltext = endeTeiltext End If

    'Das letzte Zeichen des momentanen Teiltextes festhalten endeTeiltext = zeichen + 1 End If Next ActiveSheet.Cells(zeile, spalte).Value = Trim(Mid(txt, startTeiltext, endeTeiltext - startTeiltext)) End Sub

    Kleine Frage zum Code-Editor dieses Forums: Wieso werden meine Kommentare so seltam angezeigt, dass die nachfolgenden Code-Zeilen auch grün als Kommentar hinterlegt werden?

    Nochmal merci für deine Hilfe. Mein Problem ist gelöst und ich hab einiges dazugelernt.

    Mfg
    Joe










    Freitag, 7. Dezember 2018 20:32

Alle Antworten

  • Hi,
    schreib doch einfach eine Methode, die das macht:

      Dim txt As String
      txt = "Dies ist ein Text mit vielen Wörtern, den ich nach jeweils 40 Zeichen trennen möchte, ohne dass Wörter zerrissen werden."
      Dim i1 As Integer
      Dim i2 As Integer
      Dim i3 As Integer
      i2 = 1
      i3 = 1
      For i1 = 1 To Len(txt)
        If Mid(txt, i1, 1) = " " Then
          If i1 - i2 >= 40 Then
            Debug.Print Trim(Mid(txt, i2, i3 - i2))
            i2 = i3
          End If
          i3 = i1
        End If
      Next
      Debug.Print Trim(Mid(txt, i2, i1 - i2))


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Donnerstag, 6. Dezember 2018 18:17

  • Hallo Dank Peter

    Vielen Dank für deine Hilfestellung. Genau weil ich nicht so "einfach" eine Methode schreiben kann, habe ich ja um hilfe gefragt. Letztlich hat mich deine Hilfestellung aber zum Ziel geführt. Elegante Idee deinerseits, alle Zeichen durchzugehen und per If-Abfrage nach jedem Leerzeichen den jeweiligen Textteil zu verarbeiten.

    Den einzigen "Fehler", den ich in deinem Code gefunden habe war, dass du die Leerzeichen nicht mitgezählt hattest, wenn es darum ging nach einem überprüften Leerzeichen das letzte Zeichen des momentanen Teiltextes festhalten (i3=i1+1).

    Ansonsten habe ich nur noch die relevanten Zeilen kommentiert und eingebaut, dass der Text jeweils in untereinander liegende Zeilen eingesetzt wird.

    Das hier ist meine kommentierte Lösung

    Sub ZeilenTrennenNach40Zeichen() Dim txt As String txt = Range("A1").Value Dim zeichen As Integer Dim startTeiltext As Integer Dim endeTeiltext As Integer

    'Laufvariablen zum Speichern der einzelnen Zeilen bereitstellen Dim spalte As Integer Dim zeile As Integer spalte = 1 zeile = 3

    'Hilfsvariablen für Schleife bereitstellen zeichen = 0 startTeiltext = 1 endeTeiltext = 1 'Schleife über gesamten Text For zeichen = 1 To Len(txt) 'Bei jedem Leerzeichen anhalten und prüfen, ob der aktuelle Teil des Textes über 40 Zeichen hat. If Mid(txt, zeichen, 1) = " " Then If zeichen - startTeiltext >= 40 Then 'Teiltext in Excel einfügen
    ActiveSheet.Cells(zeile, spalte).Value = Trim(Mid(txt, startTeiltext, endeTeiltext - startTeiltext)) 'Immer wenn Text geschrieben wurde den Zeilen-counter hochstellen
            'und das Startzeichen für den nächsten Teiltext festlegen
    zeile = zeile + 1 startTeiltext = endeTeiltext End If

    'Das letzte Zeichen des momentanen Teiltextes festhalten endeTeiltext = zeichen + 1 End If Next ActiveSheet.Cells(zeile, spalte).Value = Trim(Mid(txt, startTeiltext, endeTeiltext - startTeiltext)) End Sub

    Kleine Frage zum Code-Editor dieses Forums: Wieso werden meine Kommentare so seltam angezeigt, dass die nachfolgenden Code-Zeilen auch grün als Kommentar hinterlegt werden?

    Nochmal merci für deine Hilfe. Mein Problem ist gelöst und ich hab einiges dazugelernt.

    Mfg
    Joe










    Freitag, 7. Dezember 2018 20:32
  • Hi Joe,
    in meinem Code habe ich auch die Leerzeichen mitgezählt (in der For-Schleife werden alle Zeichen abgefragt). Das Leerzeichen beim Umbruch habe ich bewusst mit Trim ausgeblendet, da es für den Text keine signifikante Bedeutung hat.

    VB wird von Microsoft recht stiefmütterlich behandelt. Bei Microsoft wird vorrangig auf C# orientiert. So gibt es z.B. für einige Projektvorlagen nur eine C#-Version. Kleine Probleme in VB und Ungenauigkeiten wie die Anzeige von VB-Text werden vermutlich als nicht so wichtig betrachtet. Ich kann damit leben und melde ggf. Probleme.

    Wenn mein Beitrag hilfreich war, dann markiere ihn als "Beantwortet".

    In Programmen in Excel solltest Du immer mit Range anstelle Activate, Selection arbeiten. ActiveSheet solltest Du nur einmalig direkt nach dem Start der Methode nutzen. Wenn Du das alles nicht beachtest, kannst Du Probleme bekommen, wenn der Anwender in der Oberfläche parallel "rumklickt".


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks



    Samstag, 8. Dezember 2018 09:13