Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
508to512
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
508to512
508to512
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

String und Zeilenumbruch

String und Zeilenumbruch
02.11.2004 00:02:20
Martina
Hallo und guten Abend,
ich bin durch Zufall auf dieses Forum gestoßen (welch ein Glück) und hoffe nun, jemand kann mir helfen.
Worum geht's? Hört sich einfach an, isses für mich aber nicht. Ich hab nen String, der sich aus mehreren TextBoxen und einer RichTextBox zusammensetzt. Der String enthält verschiedene Textbeschreibungen mit Zeilenumbrüchen (Shift und Enter, nur Enter).
Wie schaffe ich es nun, dass nach max. 80 Zeichen automatisch ein Zeichenumbruch erfolgt? Dabei müssen aber vorhandene Zeilenumbrüche berücksichtigt werden. Am Ende soll ein String rauskommen, der alle bisherigen Zeilenumbrüche genauso beibehält, ergänzt um einen Zeilenumbruch nach 80 Zeichen seit dem letzten Zeilenumbruch.
Nun noch eine Schwierigkeit: ich möchte nicht, dass nach 80 Zeichen mitten im Wort umgebrochen wird. ICh will, dass nach max. 80 Zeichen umgebrochen wird, ohne dass das letzte Wort "zerrissen" wird. D.h. neuer Zeilenumbruch nach maximal 80 Zeichen, wobei das letzte Wort nicht getrennt werden darf.
Kann mir jemand helfen? Ich bin in VBA noch ein Neuling.
HErzliche Grüße
Martina

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: String und Zeilenumbruch
Ramses
Hallo
das hört sich doch sehr nach einem bekannten, allerdings noch ungelösten, Wettbewerb, in einem anderen Forum an.
"...Ich bin in VBA noch ein Neuling...."
... und dann "Excel gut - VBA gut"
"...Am Ende soll ein String rauskommen, der alle bisherigen Zeilenumbrüche genauso beibehält, ergänzt um einen Zeilenumbruch nach 80 Zeichen seit dem letzten Zeilenumbruch..."
Für was soll das gut sein ?
"...ich möchte nicht, dass nach 80 Zeichen mitten im Wort umgebrochen wird..."
Ich auch nicht, deshalb bin ich gespannt auf eine Antwort ;-)
Gruss Rainer
AW: String und Zeilenumbruch
02.11.2004 00:41:35
Martina
Hallo Rainer,
was hab ich Dir getan, dass Du so über mich herziehst?
Ich stehe seit heute Nachmittag vor dem Problem und habe viel gegoogelt. Tml, wenn die Frage in einem anderen Forum schon gestellt wurde. Mit Sicherheit nicht von mir und mit Sicherheit nicht im gleichen Sprachgebrauch.
Es tut mir leid, dass da "Excel gut - VBA gut" steht, da ist mir im Eifer des Gefechts ein Fehler unterlaufen, den ich nicht bemerkt habe. Ich würde ihn gerne korrigieren. Oder glaubst Du ich bin so Naiv und schreibe in meiner Anfrage explizit, dass ich in VBA noch ein Neuling bin und am Ende setze ich nen falschen Haken, um möglichst Unglaubwürdig zu wirken?
"Für was soll das gut sein ?"
Ich habe ein EDV-System zu bedienen, welches leider nur 80 Zeichen breite Dokumente aufnehmen und verarbeiten kann (Rechnungssystem). Am Ende des Lieferscheins sollen individuelle Textbausteine etc. angefügt werden. Maximale Zeichenbreite ist 80 Zeichen in Courier New (Nadeldrucker auf Endlospapier).
Liebe Grüße
Martina
Anzeige
AW: String und Zeilenumbruch
Jens_Pu
Hallo Martina,
da hast Du Dir ja was vorgenommen.
Ich weiß nicht, ob jemand hier das komplett so fertig hat, oder so machen möchte.
Du solltest Dich vielleicht doch etwas mit VBA beschäftigen und Dir das selbst aufbauen.
Wenn Du dann beim Umsetzen konkrete Probleme hast, kannst Du hier auch ganz geziehlt nachfragen und Dir wird sicherlich geholfen.
Als Erstes brauchst Du ein Grundgerüst, wie das Problem zu lösen sein könnte.
Ganz allgemein müsste das etwa so ablaufen:
Öffne die Datei mit dem String.
Lese eiee Zeile ein.
Schaue wie lang die ist, gößer oder kleiner als 80 Zeichen.
Wenn kleiner, passt, lassen wir so.
Wenn größer, gehe von hinten zurück bis zum letzten Leerzeichen und füge einen Return ein. usw.
Aller Anfang ist schwer, aber in der Recherche findest Du zu jedem Thema Beispiele und fragen kannst Du ja auch noch.
Sicherlich nicht das, was Du Dir vielleicht vorgestellt hast, aber es macht auch Spass. ;-)
Gruß Jens
(Noch offen, vielleicht hat ja doch jemand schon was in der Schublade)
Anzeige
AW: String und Zeilenumbruch
Ramses
Hallo
ich bin überhaupt nicht über dich hergezogen !!
Es waren lediglich ein paar Ungereimtheiten und Nachfragen.
Wäre es nicht einfacher, die Textbausteine in der Form zu definieren, als mit einem VBA-Programm einen riesigen Aufwand zu betreiben,
Ich stelle nur mal hypothetisch ein paar Fragen in den Raum:
Zeichen 79 ist ein Zeilenumbruch
Also kommt auf das Zeichen 80 ebenfalls ein Zeilenumbruch,... nun hast du 2 hintereinander. Gewollt ?
Zeichen 80 ist ein Punkt
Also kein Wort, kann also duch einen Zeilenumbruch ersetzt werden. Nun hast du den Punkt in einer neuen Zeile. Gewollt ?
Zeichen 80 ist ein Punkt aber Zeichen 81 ist ein Zeilenumbruch.
Siehe oben. Nun hast du den Punkt in einer neuen Zeile stehen und danach nochmals eine neue Zeile, weil alle bisherigen Zeilenumbrüche mitgenommen werden sollen. Gewollt ?
Zeichen 80 steht mitten in einem Wort mit, sagen wir mal, 20 zeichen. Zeilenumbruch vorher. Nun entsteht ein Flattersatz erster Güte. Gewollt ?
Ganz abgesehen davon, dass die Anzahl der Zeilen für einen Textbaustein auf einem Lieferschein mit fixer Schriftart ebenfalls limitiert ist,... erkennst du jetzt wahrscheinlich die Problematik besser.
Daher plädiere ich dafür ;-), definiert eure Textbausteine neu mit festen Regeln.
Das ist einfacher, schneller, und sieht ziemlich sicher auch noch besser aus.
Gruss Rainer
Anzeige
AW: String und Zeilenumbruch
Martina
Hallo,
dann bin ich beruhigt. Es las sich nämlich etwas anders.
"Zeichen 79 ist ein Zeilenumbruch
Also kommt auf das Zeichen 80 ebenfalls ein Zeilenumbruch,... nun hast du 2 hintereinander. Gewollt ?"
Nein
"Zeichen 80 ist ein Punkt
Also kein Wort, kann also duch einen Zeilenumbruch ersetzt werden. Nun hast du den Punkt in einer neuen Zeile. Gewollt ?"
Nein, aber ein Punkt steht direkt hinter einem Wort, ist also kein Worttrenner.
"Zeichen 80 ist ein Punkt aber Zeichen 81 ist ein Zeilenumbruch.
Siehe oben. Nun hast du den Punkt in einer neuen Zeile stehen und danach nochmals eine neue Zeile, weil alle bisherigen Zeilenumbrüche mitgenommen werden sollen. Gewollt ?"
Nein, nicht gewollt. Aber Punkt gehört zum Wort (s.o.)!
"Zeichen 80 steht mitten in einem Wort mit, sagen wir mal, 20 zeichen. Zeilenumbruch vorher. Nun entsteht ein Flattersatz erster Güte. Gewollt ?"
Nicht gewollt, aber auch nicht schlimm. Betrifft nur automatische Lieferscheine.
"Ganz abgesehen davon, dass die Anzahl der Zeilen für einen Textbaustein auf einem Lieferschein mit fixer Schriftart ebenfalls limitiert ist,... erkennst du jetzt wahrscheinlich die Problematik besser."
Ich bin mir der Problematik doch bewusst, sonst hätte ich mich doch nicht an dieses Forum gewandt. Ich selbst bekomme es nicht hin. Ich habe für eine einfache Trennung nach max. xx Zeichen einen Code-Schnipsel gefunden. Doch hab ich das Problem, dass da starr gezählt wird, d.h. ohne Rücksicht darauf vor wieviel Zeichen der letzte Zeilenumbruch war. Verstehst Du mein Problem nun eher?
Textbausteine würde ich gerne verwenden, doch ist das nur bedingt möglich. Jeder Lieferschein hat andere Hinweise, die auch nicht Standartisiert werden können. Sorry.
Hier hab ich mal den Schnipsel, den ich heute bei einer Suche über Yahoo gefunden habe. Er ist nicht wirklich brauchbar.
Dim i As Integer
Dim j As Integer

Private Sub test()
Dim lZeile As Long
Dim txt As String, tmpText As String
tmpText = TextBox1.Text 'Text aus Form2 übernehmen
TextBox2.Text = "" 'Textbox leeren
lZeile = 80 ' Länge einer Zeile auf dem Papier!
For i = 0 To Len(tmpText) Step lZeile
txt = VBA.Left(tmpText, lZeile)
For j = lZeile To 1 Step -1
If VBA.Right(txt, 1) = " " Or InStr(1, txt, " ") <= 0 Then
txt = VBA.Left(txt, Len(txt) - 1)
If Len(tmpText) - Len(txt) < 0 Then
TextBox2.Text = TextBox2.Text & txt & vbCrLf
GoTo ende
End If
tmpText = VBA.Right(tmpText, Len(tmpText) - Len(txt))
Exit For
Else
txt = VBA.Left(txt, Len(txt) - 1)
End If
Next
TextBox2.Text = TextBox2.Text & txt & vbCrLf
Next
ende:
'Irgend einen Abschlusscode
End Sub


Gruß
Martina
Anzeige
AW: String und Zeilenumbruch
02.11.2004 22:11:01
MiniMarco
Hallo Martina,
wieso nimmst Du nicht einfach eine Textbox mit MultiLine = True? Ich mein, formatieren musst Du ja anscheinend nichts. Dir geht's ja nur um den Zeilenumbruch.
Wenn ich Dich richtig verstanden habe, hast Du die Inhalte ja bereits in Textboxen. Du musst im Prinzip nur dafür Sorge tragen, dass die Width-Eigenschaft Deiner Textbox so ausgerichtet ist, dass sie maximal eine Eingabe von 80 Zeichen zulässt. Dort machst Du dann Deine Eingaben, umgebrochen wird nach erreichen des rechten Rands der Textbox automatisch. Du kannst auch manuell Trennungen vornehmen. Manuelle Zeilenschaltungen natürlich auch.
Um nun den Zeilenumbruch genauso hinzubekommen, wie angezeigt wird, brauchst Du nur folgenden Code:
"Mit den unten vorgestellten Routinen kann auf den Inhalt der MultiLine-TextBox zeilenweise zugegriffen werden. Dies ist sehr praktisch, um z.B. eine ListBox mit den Zeilen einer TextBox zu füllen, oder um die TextBox genauso auszudrucken, wie sie auf dem Bildschirm erscheint.
Außerdem wird eine Routine vorgestellt, mit der zur aktuellen Cursor-Position gescrollt werden kann (z.B. interessant, wenn die ScrollBars-Eigenschaft nicht den Wert "0 - None" hat).
Beispiele
Der folgende Code füllt bei Klick auf die Schaltfläche "cmdAnalyse" die ListBox "lstZeilen" mit den umgebrochenen Zeilen der mehrzeiligen TextBox "txtInhalt":

Private Sub cmdAnalyse_Click()
Dim i As Long
'ListBox leeren:
lstZeilen.Clear
'ListBox mit allen Zeilen füllen:
For i = 1 To TextBoxLineCount(txtInhalt)
lstZeilen.AddItem TextBoxLine(txtInhalt, i)
Next i
End Sub

Ein zeilenweiser Ausdruck könnte dadurch erreicht werden, dass im obigen Beispiel statt lstZeilen.AddItem einfach Printer.Print geschrieben wird. Jetzt müssen nur noch Probleme wie Seitenwechsel und Positionierung gelöst werden... Das überlasse ich mal als Hausaufgaben!
Wenn die TextBox "txtInhalt" den Fokus erhält, stellt der folgende Code die Sichtbarkeit des Cursors sicher:

Private Sub txtInhalt_GotFocus()
TextBoxScrollToCursor txtInhalt
End Sub

Code
Das größte Problem der Zeilen-Erkennung ist der automatische Umbruch: Dadurch werden "willkürlich" neue Zeilen erzeugt, obwohl der Anwender nicht Return gedrückt hat.
Zum Glück bietet das System einige API-Funktionen (genauer: Windows-Nachrichten), die den automatischen Zeilenumbruch berücksichtigen. Die folgenden Zeilen müssen daher im Deklarationsteil eines Moduls oder Formulars eingefügt werden:
Private Declare Function SendMessageA Lib "user32" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Any _
) As Long
Private Const EM_GETLINE = &HC4
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_SCROLLCARET = &HB7
Die folgende Funktion bestimmt die Anzahl der Zeilen; es genügt ein einfacher Aufruf einer API-Funktion:
Public Function TextBoxLineCount( _
ByRef txt As TextBox
) As Long
TextBoxLineCount = _
SendMessageA(txt.hwnd, EM_GETLINECOUNT, 0, 0&)
End Function
Eine bestimmte Zeile aus dem Inhalt einer TextBox kann mit folgender Funktion ausgeschnitten werden (die erste Zeile hat übrigens die Nummer 1):
Public Function TextBoxLine( _
ByRef txt As TextBox, _
ByVal LineNr As Long _
) As String
Dim Buffer As String * 1024
Dim Length As Long

'Buffer-Länge initialisieren:
Buffer = Chr$(Len(Buffer) And &HFF) & Chr$(Len(Buffer) \ &H100)

'Buffer mit Zeile füllen:
Length = SendMessageA(txt.hwnd, EM_GETLINE, LineNr - 1, Buffer)

'Überflüssiges abschneiden:
TextBoxLine = Left$(Buffer, Length)
End Function
Die folgende Routine sorgt für das Scrollen zur aktuellen Cursor-Position:
Sub TextBoxScrollToCursor(ByRef txt As TextBox)
SendMessageA txt.hwnd, EM_SCROLLCARET, 0, 0&
End Sub
"
Vielleicht hilft es ja.
Gruß
Marco
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige