Formatierung TextBox mit Zeilenumbruch

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Pinsch.

    Formatierung TextBox mit Zeilenumbruch

    Hallo Zusammen,

    vorab...ich areite erst seit einer woche mit vba. verzeiiht mir bitte unwissenheit :D

    ich habe folgendes problem...ich habe eine textbox in der, der benutzer willkuerlich text eintippen kann. mit zeilenumbruch und co. dieser text wird anschliessend in ein anderes programm kopiert, welches aber eine begrenzte zeilenlaenge hat. is die zeile zu lang wird sie einfach abgeschnitten und der text is im eimer...nun will ich die textbox so formatieren, dass beim verlassen der text automatisch richtig formatiert wird. stosse aber an die grenzen meiner leiehnhaften faehigkeiten...

    hatte jemand schon mal damit zu tun? als inspiration poste ich mal meinen code:

    Visual Basic-Quellcode

    1. Function StringUmdrehen(ByVal Text As String) As String
    2. Dim Buffer As String
    3. Dim n As Integer
    4. Buffer = ""
    5. For n = Len(Text) To 1 Step -1
    6. Buffer = Buffer + Mid$(Text, n, 1)
    7. Next n
    8. StringUmdrehen = Buffer
    9. End Function
    10. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    11. Dim lastspace As Integer, actpos As Integer, i2 As Integer, wrap As Integer, space As Integer, ll As Integer
    12. Dim oldt As String, newt As String, restt As String, lastchar As String, rnewt As String
    13. Dim LineLength As Integer
    14. LineLength = 10
    15. restt = TextBox1.Text
    16. For i = LineLength To Len(TextBox1.Text) Step LineLength
    17. newt = Left(restt, LineLength)
    18. wrap = InStr(newt, vbCrLf)
    19. If wrap > LineLength Or wrap = 0 Then
    20. lastchar = Right(newt, 1)
    21. If lastchar = " " Then
    22. oldt = oldt & newt & vbCrLf
    23. actpos = Len(TextBox1.Text) - i
    24. restt = Right(restt, actpos)
    25. Else
    26. rnewt = StringUmdrehen(newt)
    27. space = InStr(rnewt, " ")
    28. ll = LineLength - space
    29. newt = Left(restt, ll)
    30. oldt = old & newt & vbCrLf
    31. actpos = Len(TextBox1.Text) - i - space
    32. restt = Right(restt, actpos)
    33. End If
    34. Else
    35. oldt = oldt & newt
    36. i2 = i / LineLength
    37. actpos = Len(TextBox1.Text) - i2 * LineLength
    38. restt = Right(restt, actpos)
    39. End If
    40. Next i
    41. TextBox1.Text = oldt & restt
    42. End Sub


    Vielen Dank schon mal fuer eure Hilfe

    Pinsch
    Versuch's mal auf folgender grundlage:

    Visual Basic-Quellcode

    1. Sub textumbruch()
    2. Dim t$, t1$, p&, maxlen&
    3. t = "Lorem ipsum dolor sit amet consectetuer urna pede mauris vel quis. " & _
    4. "Justo senectus convallis dui at Nam lacinia sagittis Suspendisse orci orci. " & _
    5. "Quam augue Nullam hendrerit et hendrerit consequat laoreet quis wisi quis. Proin turpis id ac hac at."
    6. maxlen = 20
    7. While Len(t) > maxlen
    8. p = InStrRev(t, " ", maxlen, 1)
    9. t1$ = t1 & Left$(t, p) & vbCrLf
    10. t$ = Mid$(t$, p + 1)
    11. MsgBox t1$, , "Test Zeilenweise" '---> Testausgabe nach jeder Zeile
    12. Wend
    13. If Len(t) Then t1 = t1 & t
    14. MsgBox t1, , "Komplett"
    15. End Sub
    Das liegt nicht am Leerzeichen, sondern daran, das das Wort länger als 'maxlen' ist.

    Eine Möglichkeit ist, das Wort einfach umzubrechen.
    Beispiel: Aus "DasisteinganzlangesWort"
    wird bei 'maxlen = 10':

    Dasisteing
    anzlangesW
    ort



    Visual Basic-Quellcode

    1. While Len(t) > maxlen
    2. p = InStrRev(t, " ", maxlen, 1)
    3. if p then
    4. t1 = t1 & Left$(t, p) & vbCrLf
    5. t = Mid$(t, p + 1)
    6. else
    7. t1 = t1 & Left$(t, maxlen) & vbCrLf
    8. t = Mid$(t, maxlen + 1)
    9. end if
    10. MsgBox t1, , "Test Zeilenweise" '---> Testausgabe nach jeder Zeile
    11. Wend
    12. If Len(t) Then t1 = t1 & t


    Zumindest sollte Excel sicht nicht mehr aufhängen.
    geil...danke eierlein...sieht logisch aus, aber selber bin ich nich drauf gekommen :D

    hab veruscht zeilen und absaetze zu zaehlen...ging kraeftig daneben und bei wiederholung hat er dann quasi zu viele absaetze gemacht...

    dein code funktioniert auf jeden fall soweit. noch keine fehler gefunden.

    vielen, vielen dank
    Heisst das, das wenn Du mehrmals kurze Texte rüberschickst, nichts verloren geht?

    Ich hatte das so verstanden, dass nur eine maximale Anzahl an Zeichen erlaubt sein dürfen. Dann wäre aber nur in den Eigenschaften der Textbox die Maxlength auf die gewünschte Anzahl zu setzen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Also ich hab's hoehstwahrscheinlich sehr umstaendlich jetzt gemacht, aber ich verstehe es und es funktioniert :D

    das problem war, dass die formatierung einmal funktioniert und wenn man was geaendert hat, hatte sich wieder alles verschoben. war aber nur ein problem der zeichenspruenge, da vbNewLine ja zwei neue Zeichen einfuegt...

    hier der code fuer leute mit aehnlichem problem

    Visual Basic-Quellcode

    1. Private Sub textbox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    2. Dim test As Integer, restlen As Integer, i2 As Integer, wrap As Integer, space As Integer, ll As Integer, lines As Integer, wraps As Integer
    3. Dim oldt As String, newt As String, restt As String, lastchar As String, rnewt As String
    4. Dim linecheck As Boolean
    5. Dim LineLength As Integer
    6. LineLength = 36
    7. restt = textbox.Text
    8. While Len(restt) > LineLength
    9. newt = Left(restt, LineLength + 2)
    10. rnewt = StringUmdrehen(newt)
    11. wrap = InStr(rnewt, Chr(13))
    12. space = InStr(rnewt, " ")
    13. If wrap = 0 Then
    14. If space = 0 Then
    15. newt = Left(newt, LineLength)
    16. oldt = oldt & newt & vbNewLine
    17. restlen = Len(restt) - Len(newt)
    18. If restlen < 0 Then
    19. restt = restt
    20. Else
    21. restt = Right(restt, restlen)
    22. End If
    23. Else
    24. ll = LineLength - space + 3
    25. newt = Left(restt, ll)
    26. oldt = oldt & newt & vbNewLine
    27. restlen = Len(restt) - Len(newt)
    28. restt = Right(restt, restlen)
    29. End If
    30. Else
    31. ll = LineLength - wrap + 4
    32. newt = Left(restt, ll)
    33. oldt = oldt & newt
    34. restlen = Len(restt) - Len(newt)
    35. restt = Right(restt, restlen)
    36. End If
    37. Wend
    38. textbox.Text = oldt & restt
    39. End Sub


    sind glaub ich noch paar unnoetige vars vom probieren drin, aber geht auf jeden fall...

    gruss,
    Pinsch
    aber ich verstehe es und es funktioniert


    Es ist möglich, das es für deine Zwecke funktioniert, aber verstanden hast du es, meiner Meinung nach, nicht so ganz.

    Erstmal:
    SPACE ist ein Basic-Schlüsselwort, solltest du deswegen nicht als Variable verwenden.
    Statt LEFT, RIGHT, usw. solltest du LEFT$, RIGHT$,CHR$, … verwenden. (Ist bei Strings einen Tick schneller).

    Folgender Text:

    Quellcode

    1. t$ = "Seehofer sagte, er führe mit den anderen Ministerpräsidenten" & _
    2. " derzeit Gespräche über den Länderfinanzausgleich. «Uns geht " & _
    3. "es um die Herstellung von Gerechtigkeit.» Falls diese Gespräche" & _
    4. " nicht zum Erfolg führen, werde Bayern den Länderfinanzausgleich " & _
    5. "noch in diesem Jahr vor das Bundesverfassungsgericht bringen." & _
    6. $CRLF & _
    7. "Seehofer hielt sich in seiner Aschermittwochsrede wie angekündigt " & _
    8. "mit Angriffen auf die politischen Gegner zurück. Er ist derzeit " & _
    9. "nach dem Rücktritt von Bundespräsident Christian Wulff als " & _
    10. "Bundesratspräsident formell das deutsche Staatsoberhaupt."


    ergibt bei deinem CODE:

    Seehofer sagte, er führe mit den and
    eren Ministerpräsidenten derzeit Ges
    präche über den Länderfinanzausgleic
    h. «Uns geht es um die Herstellung v
    on Gerechtigkeit.» Falls diese Gespr
    äche nicht zum Erfolg führen, werde
    Bayern den Länderfinanzausgleich noc
    h in diesem Jahr vor das Bundesverfa
    ssungsgericht bringen.
    Seehofer hie
    lt sich in seiner Aschermittwochsred
    e wie angekündigt mit Angriffen auf
    die politischen Gegner zurück. Er is
    t derzeit nach dem Rücktritt von Bun
    despräsident Christian Wulff als Bun
    desratspräsident formell das deutsch
    e Staatsoberhaupt.


    Das gleiche Ergebnis erzielst du auch mit folgendem CODE:

    Visual Basic-Quellcode

    1. DIM t AS STRING, t1 AS STRING
    2. DIM p AS LONG, maxlen AS LONG
    3. maxlen = 36
    4. t = 'siehe oben
    5. WHILE LEN (t) > maxlen
    6. t1 = t1 & LEFT$(t, maxlen) & VBCRLF
    7. t = MID$(t, maxlen+1)
    8. WEND
    9. t1 = t1 & t
    10. MSGBOX t1


    :D

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

    dass es einige schwaechen aufweisst ist mir durchaus klar :D

    was zB in meinem code fehlt ist die definition der funktion stringumdrehen...

    wenn ich den text eingebe, den du beschrieben hast wird er schoen brav nach leerzeichen durchsucht und dort abgeschnitten...

    jedoch hab ich ein neues problem entdeckt bzgl. der wiederholbarkeit. nachdem der text einmal formatiert wurde und ich nochmal in das feld gehe und wieder raus, wird bei einem absatz mitten in der zeile nochmal einer eingefuegt...

    werd ich mir nachm mittag mal anschauen, was da schon wieder falsch is...

    als ergaenzung noch stringumdrehen funktion:

    Visual Basic-Quellcode

    1. Function StringUmdrehen(ByVal Text As String) As String
    2. Dim Buffer As String
    3. Dim n As Integer
    4. Buffer = ""
    5. For n = Len(Text) To 1 Step -1
    6. Buffer = Buffer + Mid$(Text, n, 1)
    7. Next n
    8. StringUmdrehen = Buffer
    9. End Function