Langen Text in gleichlange Zeilen verteilen (autom. Zeilenumbruch)

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Sachsenbauch.

    Langen Text in gleichlange Zeilen verteilen (autom. Zeilenumbruch)

    Schon geraume Zeit beschäftigt mich das Thema BLOCKTEXT, d.h. das zeilenweise zerteilen eines langen Textes in (fast) gleichlange Textzeilen, ohne dabei die Wörter zu "zerteilen".
    In den Tiefen des WWW habe ich eine Lösung für Excel gefunden, bei der Text der aktuellen Zelle in mehrere Zeilen (mit einer anzugebenden Zeilen-Länge) automatisch umgebrochen wird. So etwas hätte ich gerne für die Eingabeaufforderung (als VBScript), so daß ich zukünftige Textdateien (Plain Text) nicht erst ins Excel importieren und nach Abarbeitung des Makros wieder exportieren muss.
    Hier einmal der Quelltext für VBA

    Visual Basic-Quellcode

    1. Sub VerteilText()
    2. Dim dum$, SollBr%, anzT%, tt$()
    3. Dim zz1&, zze&, zz&, ss1%, sse%, ss%, nn&, vv&, ii%
    4. dum = InputBox("Bitte die maximale Breite des Textes eingeben.", _
    5. "Verteilung für die ausgewählten Zellen", 62)
    6. If dum = "" Then Exit Sub
    7. If IsNumeric(dum) Then SollBr = dum
    8. If SollBr < 3 Then
    9. MsgBox "Max. Breite ist kleiner als 3!", vbCritical, "VerteilText"
    10. Exit Sub
    11. End If
    12. anzT = 3
    13. ReDim tt(anzT)
    14. ' --------------------- Nummern der Start- und Endzeile/-spalte
    15. With Intersect(Selection, ActiveSheet.UsedRange)
    16. zz1 = .Row
    17. zze = .Rows.Count + zz1 - 1
    18. ss1 = .Column
    19. sse = .Columns.Count + ss1 - 1
    20. End With
    21. ' --------------------------------------------------- Verteilen
    22. For zz = zze To zz1 Step -1
    23. vv = 0
    24. For ss = ss1 To sse
    25. nn = 0
    26. tt(nn) = Cells(zz, ss)
    27. Do While Len(tt(nn)) > SollBr
    28. ii = InStrRev(tt(nn), " ", SollBr + 1)
    29. If ii > 0 Then
    30. ' Teiltexte ermitteln
    31. If nn + 1 > anzT Then anzT = anzT + 3: ReDim Preserve tt(anzT)
    32. tt(nn + 1) = Mid(tt(nn), ii + 1)
    33. tt(nn) = Left(tt(nn), ii - 1)
    34. nn = nn + 1
    35. Else
    36. ' Wort zu lang
    37. MsgBox "Zu langes Wort in Zelle " _
    38. & Cells(zz, ss).Address(False, False, xlA1), _
    39. vbInformation, "VerteilText"
    40. Exit Do
    41. End If
    42. Loop
    43. ' Teiltexte einfügen, evtl. in neue Zeilen
    44. If nn > 0 Then
    45. For ii = 0 To nn
    46. If ii > vv Then ActiveSheet.Rows(zz + ii).Insert: vv = vv + 1
    47. Cells(zz + ii, ss) = tt(ii)
    48. Next ii
    49. End If
    50. Next ss
    51. Next zz
    52. End Sub

    Als Neuling habe ich von VBA bzw. VBS nicht allzuviel Ahnung,von VB oder VB.,Net gleich gar nicht.Vielleicht kann mir das irgendjemand eine Hilfe geben.
    Danke ersteinmal :rolleyes:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim fso, zl, t, p
    3. Dim InputFile, OutputFile
    4. Const FOR_Input = 1, FOR_Output = 2
    5. zl = 62 'Zeilenlänge
    6. Set fso = WScript.CreateObject("Scripting.Filesystemobject")
    7. Set InputFile = fso.OpenTextFile("C:\##\input.txt", For_Input)
    8. Set OutputFile = fso.OpenTextFile("C:\##\output.txt", FOR_Output,True)
    9. Do Until InputFile.AtEndOfStream
    10. t = InputFile.ReadLine
    11. Do While Len(t) > zl
    12. p = InStrRev(t, " ", zl)
    13. If p Then
    14. OutputFile.WriteLine(Left(t, p - 1))
    15. t = Mid(t, p + 1)
    16. Else
    17. Exit Do
    18. End If
    19. Loop
    20. If Len(t) Then OutputFile.WriteLine(t)
    21. Loop
    22. InputFile.Close
    23. OutputFile.Close
    24. MsgBox("Fertig")
    Herzlichen Dank Eierlein,
    wie immer zur vollsten Zufriedenheit gelöst.
    Ich habe nur die konstante Umbruchspalte durch eine Inputbox-Abfrage ersetzt.

    Visual Basic-Quellcode

    1. zl=CInt(Inputbox("Zeilenumbruch nach wieviel Spalten ?","manueller Zeilenumbruch",24)) ' nur ganze Zahlen

    Schön wäre es jetzt, wenn man daraus noch einen echten Blocksatz machen könnte, d.h. die Anzahl der Leerzeichen so erhöht und verteilt, daß der rechte Rand immer glatt ist und bei Spalte 62 aufhört.
    Das würde dem ganzen ein profimäßiges Aussehen verleihen und damit ein echter BLOCKSATZ sein... ;)

    Also nochmals vielen Dank und einen schönen Tag
    Mit Blocksatz:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim fso, zl, t, t1, p, pp, p1, lz, l
    3. Dim InputFile, OutputFile
    4. Const FOR_Input = 1, FOR_Output = 2
    5. zl = 62 'Zeilenlänge
    6. Set fso = WScript.CreateObject("Scripting.Filesystemobject")
    7. Set InputFile = fso.OpenTextFile("d:\input.txt", For_Input)
    8. Set OutputFile = fso.OpenTextFile("d:\output.txt", FOR_Output,True)
    9. Do Until InputFile.AtEndOfStream
    10. t = InputFile.ReadLine
    11. Do While Len(t) > zl
    12. p = InStrRev(t, " ", zl)
    13. If p Then
    14. t1 = Left(t, p - 1)
    15. t = Mid(t, p + 1)
    16. l = Len(t1)
    17. If l < zl Then
    18. p1 = 1 : lz = 0
    19. While InStr(p1, t1, " ")
    20. pp = InStr(p1, t1, " ")
    21. If pp Then lz = lz + 1
    22. p1 = pp + 1
    23. Wend
    24. While l < zl
    25. t1 = Replace(t1, " ", " ",1, zl-l)
    26. l = Len(t1)
    27. Wend
    28. OutputFile.WriteLine(t1)
    29. End If
    30. Else
    31. Exit Do
    32. End If
    33. Loop
    34. If Len(t) Then OutputFile.WriteLine(t)
    35. Loop
    36. InputFile.Close
    37. OutputFile.Close
    38. MsgBox("Fertig")
    Dateien
    • input.txt

      (7,86 kB, 289 mal heruntergeladen, zuletzt: )

    Blocktext.vbs zur vollsten Zufriedenheit gelöst . DANKE

    Hallo Eierlein,
    bitte entschuldige mein spätes Feedback - ich war ein bisschen indisponiert

    Ich bin - wie immer - hellauf begeistert von Deinem Code und ich danke Dir ganz herzlich für Deine Mühe.
    So habe ich mir das gewünscht.

    Also nochmals herzlichen Dank, abschließend wünsche Dir noch einen schönen heißen Sonntag... 8o