Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1960to1964
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
Inhaltsverzeichnis

Textbox länge auslesen

Textbox länge auslesen
26.01.2024 22:39:47
EberhardDaniel
Guten Abend zusammen

Ich habe mir einen Code gebastelt, welcher den Text aus einer Textbox direkt in eine Zelle schreibt. Diese wird automatisch auf die Länge angepasst. Sobald die Zelle eine bestimmte Breite hat, erscheint eine msgbox. Dies funktioniert auch.
Bei einer Textbox brauche ich einen "zwei Zeiler". Sobald ich die Enter Taste drücke, wird der Text in der Zelle untereinander geschrieben und nicht mehr nach rechts.
Die Textbox darf nur zwei Zeilen enthalten, da sonst die Zelle zu hoch wird.
Gibt es eine Möglich dies zu realisieren?

Besten Dank für Eure Hilfe.
Freundliche Grüsse
Daniel Eberhard



Private Sub TBTechniker_Change()

'max. Spaltenlänge = 74 Spalte "B"
Set ws = ThisWorkbook.Worksheets("Textlänge")
ws.Range("B1").Value = TBTechniker.Value
ws.Range("B1").EntireColumn.AutoFit
If ws.Range("B1").ColumnWidth > 74 Then MsgBox "Text ist zu lang", vbCritical, "Halt!"
Klick = "OK"
Set ws = Nothing

End Sub

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Textbox länge auslesen
27.01.2024 06:11:03
EberhardDaniel
Guten Morgen

Anscheinend hat etwas nicht ganz funktioniert.
Guten Abend zusammen

Ich habe mir einen Code gebastelt, welcher den Text aus einer Textbox direkt in eine Zelle schreibt. Diese wird automatisch auf die Länge angepasst. Sobald die Zelle eine bestimmte Breite hat, erscheint eine msgbox. Dies funktioniert auch.
Bei einer Textbox brauche ich einen "zwei Zeiler". Sobald ich die Enter Taste drücke, wird der Text in der Zelle untereinander geschrieben und nicht mehr nach rechts.
Die Textbox darf nur zwei Zeilen enthalten, da sonst die Zelle zu hoch wird.
Gibt es eine Möglich dies zu realisieren?

Besten Dank für Eure Hilfe.
Freundliche Grüsse
Daniel Eberhard




Private Sub TBTechniker_Change()

'max. Spaltenlänge = 74 Spalte "B"
Set ws = ThisWorkbook.Worksheets("Textlänge")
ws.Range("B1").Value = TBTechniker.Value
ws.Range("B1").EntireColumn.AutoFit
If ws.Range("B1").ColumnWidth > 74 Then MsgBox "Text ist zu lang", vbCritical, "Halt!"
Klick = "OK"
Set ws = Nothing

End Sub
Anzeige
AW: Textbox länge auslesen
27.01.2024 08:23:57
Oberschlumpf
Hi Daniel,

versuch es mal so: (ungetestet)


Private Sub TBTechniker_Change()
Dim larstrSplit() As String
'max. Spaltenlänge = 74 Spalte "B"
Set ws = ThisWorkbook.Worksheets("Textlänge")
ws.Range("B1").Value = TBTechniker.Value
ws.Range("B1").EntireColumn.AutoFit
If ws.Range("B1").ColumnWidth > 74 Then MsgBox "Text ist zu lang", vbCritical, "Halt!"
larstrSplit = Split(ws.Range("B1").Value, vbcrl)
If UBound(larstrSplit) >= 1 Then
MsgBox "Text hat mehr als 2 Zeilen", vbCritical, "Halt!"
End If
Klick = "OK"
Set ws = Nothing

End Sub

Mit Split() trennst du einen Text mit einem bestimmten Trennzeichen; hier vbCrLf = Zeilenumbruch mit Enter.
Und wenn es mit Split() mehr als 2 Einträge gibt, hast du mehr als 1x Enter gedrückt.

Ach ja, versuch in all deinen Codes DIM zu verwenden; mehr zu DIM findest du im Internet.

Hilfts?
Nein? Dann zeig bitte per Upload eine Bsp-Datei mit allem, was erforderlich ist, um dein Problem, bzw die Lösung dazu erstesten zu können.

Ciao
Thorsten

PS ColumnWidth ist nicht die Spaltenlänge sondern die Spaltenbreite.
Anzeige
Korrektur
27.01.2024 09:52:31
Oberschlumpf
Hi,

änder das hier...

If UBound(larstrSplit) >= 1 Then

...um in...

If UBound(larstrSplit) >= 2 Then

...denn 1 wäre ja erreicht bei genau 1x Entertaste, und DAS ist ja das maximal Erlaubte.

Hilfts?

Ciao
Thorsten
AW: Korrektur
27.01.2024 10:00:35
EberhardDaniel
Hallo Thorsten
Ich kriege da noch eine Fehlermeldung.



larstrSplit = Split(ws.Range("B1").Value, vbcrl)


Gruss Daniel Eberhard
AW: Korrektur
27.01.2024 10:06:31
Oberschlumpf
Hi,

ok, und bitte welchen Teil von...

"Hilfts?
Nein? Dann zeig bitte per Upload eine Bsp-Datei mit allem, was erforderlich ist, um dein Problem, bzw die Lösung dazu erstesten zu können."


...in meiner 1. Antwort nicht gelesen?

Wenn diese, meine Gegenfrage "schnippisch" oder ähnlich rüberkommt, dann sag ich nich "sorry"...denn...ich machte mir ja schon die Mühe und dich darauf aufmerksam, bitte ne Datei per Upload zu zeigen, wenn ich (noch) nicht helfen konnte - wenn meine Mühe nicht beachtet wird, gibts eben ne Antwort wie oben - denn - ich kann ja jetzt - ohne deine Datei - noch immer nicht helfen.

Ciao
Thorsten
Anzeige
AW: Korrektur
27.01.2024 10:14:30
EberhardDaniel
Hallo Thorsten
Habe den Fehler gefunden. Es fehlte einen Buchstaben am Schluss. vbCrLf wäre richtig. :-)
Aber jetzt sollte er nach Enter drücken die Länge der Spalte wieder überprüfen. Falls diese erreicht ist, soll die Fehlermeldung erneut erscheinen. Eine dritte Zeile soll es nicht zulassen. Diese zwei funktionieren noch nicht. :-(

Vielleicht als Ergänzung:
Ich habe bei der Textbox EnterKeyBehavior und MultiLine auf True gesetzt.

Gruss Daniel Eberhard
AW: Korrektur
27.01.2024 10:19:00
Oberschlumpf
und ich (andere ja vllt nicht) benötige von dir noch immer eine Bsp-Datei, wenn du möchtest, dass ich helfen soll
Anzeige
AW: Korrektur
27.01.2024 12:03:40
Oberschlumpf
Hi Daniel,

danke!

hier, versuch mal:
https://www.herber.de/bbs/user/166462.xlsm

Das Ganze funktioniert in der von dir gezeigten Bsp-Datei aber wohl genau nur 1x.
Zum erneuten Testen müsstest du also immer erst mal wieder Spalte A komplett löschen.

Warum?
Weil dein Code in der Bsp-Datei nur auf Zelle A1 Bezug nimmt.
Weder im Code, noch in deinen bisherigen Beschreibungen kann ich erkennen - wann genau welche Zelle (Zeile) mit deinem Userform gefüllt werden soll.
Und deshalb kann auch ich nur Bezug nehmen auf Zelle A1.

Bitte beachte auch meine Kommentare im Code. Ich hab versucht, dir die ganzen Abhängigkeiten im Code zu erklären.

Ciao
Thorsten
Anzeige
AW: Korrektur
27.01.2024 15:14:44
EberhardDaniel
Hallo Thorsten
Ist gar nicht so einfach zum Erklären. Es funktioniert immer noch nicht ganz wie ich es möchte.
Versuch mal folgendes:
Schreibe in die erste Zeile Intro: Kusi. Danach drücke die Enter Taste.
Nun versuche in die zweite Zeile einen längeren Text zu schreiben als in der ersten Zeile.
Ich möchte dass es in der zweiten Zeile auch die länge kontrolliert. Damit der Text nicht länger wird als die Spaltenbreite 30.
Toll wäre auch, wenn die erste Zeile die Breite erreicht hat, automatisch bei der zweiten Zeile weiter schreibt.
Du hast vielleicht einen bessere Vorschlag als meinen. Muss also nicht zwingend mein Code sein.

Sorry das ich dich damit so beschäftige.

Gruss und vielen, vielen Dank für Deine Bemühungen.
Anzeige
AW: Korrektur
27.01.2024 18:05:50
Oberschlumpf
Hi Daniel,

hier, neuer Versuch, und zumindest ich denke, auch nach deinen neuen Angaben funktioniert nun alles
https://www.herber.de/bbs/user/166465.xlsm

Beachte die neuen Kommentare im Code.

Ach ja, weiterhin funktioniert alles nur 1x mit Zelle A1

Weil du noch immer keine geeignete Bsp-Datei gezeigt hast, wenn auch andere Zellen mit deinem Userform gefüllt werden sollen - und davon gehe ich aus, dass es nicht nur Zelle A1 sein soll.

Ciao
Thorsten
AW: Korrektur
28.01.2024 09:16:45
EberhardDaniel
Guten Morgen Thorsten
Habe die neue Version mal getestet. Aber irgendwie funktioniert es immer noch nicht ganz nach meinen Vorstellungen.

1. Schreibe ich einen Text in der ersten Zeile bis die Spaltenbreite erreicht ist, erscheint zwar die Meldung "Text zu lang".
Aber nach OK drücken kann in der ersten Zeile weiter geschrieben werden. Da wäre es cool, wenn es auf die zweite Zeile springen würde.

2. Das gleiche passiert, wenn ich die Enter Taste drücke. Es dürfen nur maximum zwei Zeilen eingetragen werden!
Nach der Warnmeldung kann ich jedoch immer noch weitere Zeilen einfügen.

3. Zu Deiner Frage: Die Textbox wird über einer Auswahl einer Listbox aus einem Tabellenblatt gefüllt. Nach Änderungen in der Textbox werden die neuen Daten über einen Button übernommen. Aus diesem Grund ändert sich die Zeile immer wieder. Aber dies habe ich hingekriegt. Die Originialdatei wäre zu gross. Darum habe ich eine Musterdatei erstellt.

Aber Thorsten, wenn es Dir zu viel wird, dann lassen wir es. OK?

Wünsche Dir einen schönen Sonntag.

Gruss Daniel Eberhard
Anzeige
bitte wer anders
28.01.2024 09:40:03
Oberschlumpf
Hi Daniel,

ja, du hast recht. Zumindest ich kann dir nicht weiterhelfen.
Du beschreibst immer nur, was wann wie wo warum passieren soll.

Und niemand, auch ich nicht, erwartet von dir, dass du uns die Originialdatei zeigen sollst - DAS sollst du ja auch gar nicht!
Aber ist es wirklich zu viel verlangt, uns per Upload eine (neue) Bsp-Datei zu zeigen, die vom Aufbau her genau so ist, wie deine Originialdatei ?

mit Aufbau meine ich, in deiner Bsp-Datei...
- sollten die selben Zeilen/Spalten wie im Originial verwendet werden
- sollte nur das gezeigt werden, was notwendig ist, um dein Problem auch sehen zu können
- Tabellenblätter, die nicht zur Lösung beitragen, müssen auch nicht in der Bsp-Datei enthalten sein
- du schreibst was von Listbox im Originial; bitte WO in der Bsp-Datei ist eine Listbox und alle anderen Abhängigkeiten, von denen du nur etwas (be)schreibst????

Aber nun denn, vielleicht hat ja noch einer von den vielen anderen Antwortern Ideen für dich.

Ciao
Thorsten
Anzeige
AW: bitte wer anders
29.01.2024 12:25:01
Pappawinni
Ich will mich damit eigentlich auch nicht wirklich herumschlagen, aber ich war halt neugierig und hab mal mit dem Code etwas gespielt.
Wo das hin führen soll will auch nicht wirklich wissen trotzdem mal das, was da bei mir rausgekommen ist, damit die Spielerei vielleicht nicht
ganz für die Hühner war. DIE Lösung ist das sicher auch nicht.



Private Sub TextBox1_Change()

'max. Spaltenlänge = 74 Spalte "B"
Set ws = ThisWorkbook.Worksheets("Tabelle1")
If Len(TextBox1.Value) > 0 Then ws.Range("A1").EntireColumn.ColumnWidth = 31
ws.Range("A1").Value = TextBox1.Value
ws.Range("A1").EntireColumn.AutoFit
If ws.Range("A1").ColumnWidth > 30 Then ' MsgBox "Text ist zu lang", vbCritical, "Halt!" -- wieso deaktivierst du denn DEINE Kontrolle auf Spaltenbreite??? Die muss doch weiterhin vorhanden sein
MsgBox "Text ist zu lang", vbCritical, "Halt!"
TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 1)
End If

'so, und dank deiner nun doch gezeigten Bsp-Datei hab ich schnell gemerkt, dass meine 1. Idee NULL weiterhilft...nun ja..ich hatte ja auch nix zum Testen von dir
'die Lösung - zumindest für die Bsp-Datei - ist das Prüfen der Zeilenhöhe, weil...
'2 x pdbHeight = 2 Zeilen in Zelle A1
'mehr als 2 x pdbHeight = mindestens DREI Zeilen in Zelle A1, und somit 1x zu viel

If ws.Range("A1").RowHeight > pdbHeight * 2 Then
MsgBox "Zeile ist zu hoch", vbCritical, "Halt!"
TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 2)
End If

Set ws = Nothing

End Sub
Anzeige
AW: bitte wer anders
29.01.2024 13:08:56
Pappawinni
UPS....
das hab ich auch noch geändert damit sich der Wert nicht womöglich ändert, weil die Form mehrfach geladen wird, oder sowas.



Private Sub UserForm_Initialize()
'und hier - direkt nach Start (noch vor Sichtbarkeit) deines Userforms merkt sich der Code die Höhe der Zeile in der ein Zellinhalt mit deinem Userform gefüllt wird

'ACHTUNG!
'in diesem Code für die Bsp-Datei merkt sich der Code IMMER NUR die Zeilenhöhe von Zelle A1 !
'zumindest ich kann weder in deinen Beiträgen, und auch nicht in deinem Code in der Bsp-Datei erkennen, wann genau welche Zelle mit deinem Userform gefüllt wird/werden soll
'somit kann ich nur die Zeilenhöhe von Zelle A1 prüfen
If pdbHeight = 0 Then pdbHeight = Sheets("Tabelle1").Range("A1").RowHeight

End Sub
Doch noch ne Idee
31.01.2024 21:46:14
Pappawinni
Man könnte ja im Fehlerfall einfach den vorherigen Zustand wieder herstellen.
Dazu könnte man dann noch eine globale Variable einführen. hier strAltTextBox1
Modul1:


Option Explicit

'der Code muss wissen, wie hoch die Zeile ist - bevor - eine Zelle mit deinem Userform gefüllt wird
'und dafür ist eine sogenannte öffentliche, oder PUBLIC-Variable erforderlich, die überall im Code bekannt sein muss
'öffentliche/Public-Variablen müssen in einem allgemeinen Modul deklariert werden; woanders ist das nicht möglich
Public pdbHeight As Double
Public strAltTextBox1 As String


diese dann natürlich bei der Initialisierung als leeren String definieren und am Ende des Textbox_Change Events mit dem
jeweils aktuellen Wert der Textbox belegen.
Im Fehlerfall wird einfach der Wert von strAltTextBox1 der Textbox und damit auch der Zelle zugewiesen....

Private Sub TextBox1_Change()

'max. Spaltenlänge = 74 Spalte "B"
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Tabelle1")
If Len(TextBox1.Value) > 0 Then ws.Range("A1").EntireColumn.ColumnWidth = 31
ws.Range("A1").Value = TextBox1.Value
ws.Range("A1").EntireColumn.AutoFit
If ws.Range("A1").ColumnWidth > 30 Then ' MsgBox "Text ist zu lang", vbCritical, "Halt!" -- wieso deaktivierst du denn DEINE Kontrolle auf Spaltenbreite??? Die muss doch weiterhin vorhanden sein
MsgBox "Text ist zu lang", vbCritical, "Halt!"
TextBox1.Value = strAltTextBox1
End If

'so, und dank deiner nun doch gezeigten Bsp-Datei hab ich schnell gemerkt, dass meine 1. Idee NULL weiterhilft...nun ja..ich hatte ja auch nix zum Testen von dir
'die Lösung - zumindest für die Bsp-Datei - ist das Prüfen der Zeilenhöhe, weil...
'2 x pdbHeight = 2 Zeilen in Zelle A1
'mehr als 2 x pdbHeight = mindestens DREI Zeilen in Zelle A1, und somit 1x zu viel

If ws.Range("A1").RowHeight > pdbHeight * 2 Then
MsgBox "Zeile ist zu hoch", vbCritical, "Halt!"
TextBox1.Value = strAltTextBox1
End If

Set ws = Nothing
strAltTextBox1 = TextBox1.Value

End Sub

Private Sub UserForm_Initialize()
'und hier - direkt nach Start (noch vor Sichtbarkeit) deines Userforms merkt sich der Code die Höhe der Zeile in der ein Zellinhalt mit deinem Userform gefüllt wird

'ACHTUNG!
'in diesem Code für die Bsp-Datei merkt sich der Code IMMER NUR die Zeilenhöhe von Zelle A1 !
'zumindest ich kann weder in deinen Beiträgen, und auch nicht in deinem Code in der Bsp-Datei erkennen, wann genau welche Zelle mit deinem Userform gefüllt wird/werden soll
'somit kann ich nur die Zeilenhöhe von Zelle A1 prüfen
If pdbHeight = 0 Then pdbHeight = Sheets("Tabelle1").Range("A1").RowHeight
strAltTextBox1 = ""

End Sub


Ob das überhaupt das Ziel der Übung war, weiss ich aber eigentlich nicht.
Nachdem sich ja niemand mehr gemeldet hat, muss der Thread wohl auch nicht mehr offen bleiben....

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige