Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Die MSForms-Bibliothek beherbergt einige Steuer-elemente, die unter Access ein stiefmütterliches Dasein erleben. Es gibt jedoch Einsatzzwecke, welche die dort enthaltenen Steuer-elemente ans Tageslicht kommen lassen. Eines dieser Steuer-elemente ist die MSForms-Textbox. Sie bietet gegenüber dem eingebauten TextBox-Steuerelement unter anderem den Vorteil, dass auch Texte mit mehr als 64.000 Zeichen angezeigt werden können. Die übrigen Vor- und Nachteile liefert der vorliegende Beitrag.
Problem Bearbeitung langer Texte
Ein Problem herkömmlicher Textfelder ist, dass Sie damit keine Texte bearbeiten können, die länger als 64.000 Zeichen sind. Dies können Sie reproduzieren, indem Sie eine Tabelle namens tblTexte mit den beiden Feldern Text-ID und Inhalt (Datentyp: Langer Text/Memo) anlegen.
Erstellen Sie dann ein Formular mit der Tabelle tblTexte als Datenherkunft und fügen Sie die beiden Felder aus der Feldliste zum Formularentwurf hinzu. Nun legen wir einen Text von knapp 64.000 Zeichen im ersten Datensatz der Tabelle an:
Public Sub EinLangerText() Dim db As DAO.Database Dim rst As DAO.Recordset Dim strText As String Set db = CurrentDb Set rst = db.OpenRecordset("SELECT * FROM tblTexte", _ dbOpenDynaset) rst.AddNew strText = String(63995, "A") rst!Inhalt = strText rst.Update End Sub
Wechseln Sie dann zum Formular in der Formularansicht und fügen Sie noch ein paar Zeichen zum Text hinzu. Nach dem Hinzufügen von fünf Zeichen werden Sie keine neuen Zeichen mehr hinzufügen können – das Limit von 64.000 ist dann erreicht. Sie können auch nicht mehr als 64.000 Zeichen über eine INSERT INTO-Anweisung hinzufügen. Die einzige Möglichkeit ist der Einsatz der oben verwendeten Prozedur mit den DAO-Methoden AddNew und Update des Recordset-Objekts.
Das ändern des Textes ist weder in der Datenblattansicht der Tabelle noch im Formular möglich.
Lange Texte in der MSForms-TextBox
Damit kommt der Einsatz der MSForms-TextBox. Diese fügen Sie hinzu, indem Sie im Ribbon zum Tab Entwurf wechseln und das Menü unter Steuer-elemente aufklappen und den Eintrag ActiveX-Steuerelemente auswählen (s. Bild 1).
Bild 1: öffnen des Dialogs zum Hinzufügen von ActiveX-Steuerelementen
Daraufhin erscheint der Dialog aus Bild 2, mit dem Sie den Eintrag Microsoft Forms 2.0 TextBox selektieren und dieses per Mausklick auf die OK-Schaltfläche zum Formularentwurf hinzufügen können. Das neue Steuer-element wird dann relativ klein in der linken, oberen Ecke des Formulars angelegt – Sie dürften das vom TreeView-Steuerelement her kennen.
Bild 2: Der Dialog zur Auswahl von ActiveX-Steuerelementen
Die weiteren offensichtlichen Unterschiede zwischen diesem Steuer-element und dem eingebauten TextBox-Element sind das fehlende Bezeichnungsfeld sowie der 3D-Effekt für den Rahmen (s. Bild 3).
Bild 3: Das herkömmliche Textfeld und sein MSForms-Bruder
Wenn wir uns die Eigenschaften dieses Steuerelements ansehen, finden wir auf den meisten Registerseiten eine vergleichsweise geringe Menge an Eigenschaften vor. Die spezifischen Eigenschaften des Steuerelements finden wir in englischer Sprache auf der Registerseite Andere (s. Bild 4). Bevor wir uns die Eigenschaften unter VBA ansehen, benennen wir das Steuer-element noch schnell in txtMSForms um.
Bild 4: Eigenschaften der MSForms-TextBox
Danach können wir zum VBA-Editor wechseln, mit dem Menübefehl Ansicht|Objektkatalog (oder F2) den Objektkatalog öffnen und uns die Eigenschaften des TextBox-Objekts der Bibliothek MSForms ansehen (s. Bild 5). Hier finden Sie noch einige weitere Einträge gegenüber denen im Eigenschaftsfenster.
Bild 5: Eigenschaften unter VBA
Aus eins mach zwei
Das ActiveX-Steuerelement besteht aus einem Container des Typs CustomControl sowie dem darin enthaltenen Steuer-element TextBox. Den Container referenzieren wir direkt über den Namen des Elements, das enthaltene Steuer-element über die Eigenschaft Object.
Dies verdeutlichen die folgenden beiden Codezeilen, mit denen wir den Typ der beiden Elemente im Direktbereich ausgeben:
Debug.Print TypeName(Me!txtMSForms) Debug.Print TypeName(Me!txtMSForms.Object)
Diese liefern nämlich:
CustomControl
TextBox
Eigenschaften per IntelliSense
Wenn Sie einfach Me!txtMSForms.Object und den Punkt im VBA-Editor eingeben, würden Sie vermutlich gern eine Liste der Eigenschaften und Methoden präsentiert bekommen.
Das ist aber nicht der Fall. Eine Alternative wäre es, eine Objektvariable für das TextBox-Element zu deklarieren und diese im Form_Load-Ereignis des Formulars zu füllen. Hier ist die Deklaration:
Dim objMSForms As MSForms.TextBox
Und so stellen Sie die Objektvariable ein:
Private Sub Form_Load() Set objMSForms = Me!txtMSForms.Object With objMSForms ''''... End With End Sub
Ereignisse
Die Menge der über das Eigenschaftsfenster verfügbaren Ereigniseigenschaften ist mit Bei OLE Aktualisierung, Beim Hingehen, Beim Verlassen, Bei Fokuserhalt und Bei Fokusverlust überschaubar. Der Grund für diese wenigen Ereignisse ist, dass dies die Ereignisse des CustomControl-Elements sind, das als Container für das eigentliche Steuer-element dient – diese Ereignisse finden Sie also auch bei den übrigen Steuerelementen der MSForms-Sammlung.
Wenn Sie die Ereignisse des eigentlichen Steuerelements nutzen wollen, müssen Sie den VBA-Editor zum Anlegen bemühen. Hier wählen Sie aus dem linken Kombinationsfeld den Namen des Steuerelements aus, hier txtMSForms. Im rechten Kombinationsfeld erscheinen dann die verfügbaren Ereignisse (s. Bild 6). Das Ereignis txtMSForms_Change wird hier automatisch bei Auswahl des Eintrags im linken Kombinationsfeld angelegt. Erfreut stellen wir hier fest, dass das TextBox-Element der MSForms-Bibliothek offensichtlich über Drag and Drop-Funktionalität verfügt, was wir uns weiter unten noch ansehen werden.
Bild 6: Anlegen von Ereignisprozeduren für MSForms-Steuerelemente
Ein wesentlicher Unterschied zum herkömmlichen TextBox-Element ist, dass es kein Before-Update und AfterUpdate-Ereignis gibt, sondern nur ein Updated-Ereignis.
Beim Eingeben eines Zeichens werden beispielsweise die folgenden Ereignisse in dieser Reihenfolge ausgelöst:
KeyDown KeyPress Updated Updated Change KeyUp
Datenbindung
Eine der wichtigeren Fragen für uns als Access-Benutzer ist natürlich: Können wir das Steuer-element an ein Feld der an das Formular gebundenen Datenherkunft binden Die Antwort lautet ja – das TextBox-Element der MSForms-Bibliothek liefert mit Steuerelementinhalt genau die gleiche Eigenschaft für diesen Zweck wie das eingebaute TextBox-Element. Also binden wir das Steuer-element doch gleich einmal an das Feld Inhalt, an das wir auch das Textfeld im gleichen Formular gebunden haben.
Nun können wir uns auch direkt davon überzeugen, was geschieht, wenn wir versuchen, einen Text mit mehr als 64.000 Zeichen zu bearbeiten. Das Erste, was uns auffällt, ist die unterschiedliche Darstellung des Textes. Das eingebaute TextBox-Element bricht die Zeilen des anzuzeigenden Textes um, die MSForms-TextBox zeigt nur eine Zeile an.
Auch das Einfügen von Zeilenumbrüchen macht es nicht besser – diese werden im Standardzustand in Form eines entsprechenden Symbols angezeigt (s. Bild 7).
Bild 7: Anzeige des gleichen Textes in den beiden TextBox-Elementen
Zeilenumbruch
Wir können aber durch Einstellen der Eigenschaft MultiLine auf den Wert Ja (im Eigenschaftsfenster) oder True (per VBA) dafür sorgen, dass die Inhalte in der MSForms-TextBox mit Zeilenumbruch ausgegeben werden. Wenn MultiLine auf Ja eingestellt ist, werden die Zeilenumbrüche ausgeführt und nicht als Icon dargestellt.
Nun kommt noch die Eigenschaft WordWrap ins Spiel: Stellen Sie diese auf Nein ein, werden Zeilen nur umbrochen, wenn Sie einen Zeilenumbruch eingefügt haben. Anderenfalls reichen die Zeilen über den rechten Rand des Steuerelements hinaus. Dies können Sie ändern, indem Sie WordWrap auf Ja einstellen. Dann werden die Zeilen an Leerzeichen umbrochen oder, wenn eine Zeile kein Leerzeichen aufweist, an der Stelle vor dem Erreichen des rechten Randes des Steuerelements.
Neue Zeilen
Wenn Sie mit der Eingabetaste neue Zeilenumbrüche hinzufügen wollen, können Sie dies immer bei gedrückter Strg-Taste erledigen – das allerdings nur, wenn die Eigenschaft Multiline auf den Wert True eingestellt ist. Erst wenn Sie die Eigenschaft EnterKeyBehavior auf den Wert True einstellen, erzeugt auch das reine Drücken der Eingabetaste (ohne Strg) einen Zeilenumbruch.
Anpassen an das Layout der eingebauten TextBox
Damit wir das gleiche Look and Feel wie mit dem eingebauten TextBox-Steuerelement erhalten, legen wir als Erstes die Schriftart fest. Das können wir nicht im Eigenschaftsfenster erledigen, da die entsprechende Eigenschaft dort nicht aufgeführt wird.
Stattdessen legen wir die notwendigen Codezeilen in der Form_Load-Ereignisprozedur des Formulars an:
Set objMSForms = Me!txtMSForms.Object With objMSForms .Font.Name = "Calibri" .Font.Size = 11 .ScrollBars = fmScrollBarsHorizontal End With
Hier stellen wir auch gleich die Bildlaufleiste am rechten Rand ein. Es gibt übrigens vier Werte für die Eigenschaft ScrollBars:
- fmScrollBarsBoth
- fmScrollBarsHorizontal
- fmScrollBarsNone
- fmScrollBarsVertical
Ausrichtung einstellen
Die Ausrichtung des Textes legen Sie mit der Eigenschaft TextAlign ein. Diese erwartet einen der folgenden Werte:
- fmTextAlignLeft (1): Ausrichtung links
- fmTextAlignCenter (2): zentrierte Ausrichtung
- fmTextAlignRight (3): Ausrichtung rechts
Automatische Größe
Eine interessante Eigenschaft heißt AutoSize. Wenn Sie diese auf Ja einstellen, erhalten Sie ein Textfeld, das beim öffnen des Formulars auf die Länge der längsten Zeile des Inhalts eingestellt wird und das beim Eingeben von Text nach unten wächst (aber nicht in die Breite). Ich konnte noch keinen Sinn ausmachen, aber wer weiß …
MaxLength und AutoTab
Diese beiden Eigenschaften MaxLength und AutoTab hören sich interessant an, wenn man ihre Beschreibung in der Onlinehilfe liest. Bei MaxLength = 4 und AutoTab = True etwa soll der Fokus nach der Eingabe auf das nächste Steuer-element verschoben werden, was etwa für die Eingabe von Registrierungsdaten aus mehreren Zeichenketten wie 1234-2345-3456-4567 interessant wäre. Leider klappt dies nicht wie in der Dokumentation beschrieben.
Markierten Text auslesen
Für die folgenden Beispiele erstellen wir ein neues Formular, das wir auch an die Tabelle tblTexte binden. Es enthält ein MSForms-Textfeld namens txtMarkierungen, das wir an das Feld Inhalt des Formulars binden.
Wenn der Benutzer eine Markierung mit der Maus durchgeführt hat, soll der markierte Text in einem weiteren Textfeld namens txtMarkierterText angezeigt werden. Dazu legen wir die folgenden Codezeilen im Klassenmodul des Formulars an:
Dim objMarkierungen As MSForms.TextBox Private Sub Form_Load() Set objMarkierungen = Me.txtMarkierungen.Object End Sub Private Sub txtMarkierungen_MouseUp(...) Me!txtMarkierterText = objMarkierungen.SelText End Sub
Die Form_Load-Prozedur füllt die Objektvariable mit einem Verweis auf die MSForms-TextBox. Dann nutzen wir MouseUp-Ereignisprozedur, um den markierten Text mit der SelText-Eigenschaft auszulesen und im Textfeld txtMarkierterText auszugeben (s. Bild 8).
Bild 8: Erfassen einer Markierung
Analog können wir mit den Eigenschaften SelStart und SelLength herausfinden, welcher Bereich markiert ist. Das ist an sich kein Vorteil gegenüber dem normalen Textfeld, aber da dort die SelStart– und die SelLength-Eigenschaft als Integer definiert sind, können Sie dort nur Positionen bis zum 65.535ten Zeichen bestimmen. In der MSForms-TextBox hingegen gibt es diese Beschränkung nicht.
Weitere Eigenschaften zur aktuellen Markierung: CurLine, CurTargetX, CurX
Die Eigenschaft CurLine liefert die Nummer der Zeile, in der sich aktuell die Einfügemarke beziehungsweise das erste Zeichen der aktuellen Markierung befindet. Diese Eigenschaft ist 0-basiert.
Die Eigenschaft CurX liefert die horizontale Position der Einfügemarke in der Einheit HIMETRIC. CurTargetX liefert laut Dokumentation die „bevorzugte“ Position der Einfügemarke. Aus unseren Experimenten ergab sich kein sinnvoller Einsatzzweck für diese Eigenschaften.
Markierung erweitern
Die Eigenschaft AutoWordSelect legt fest, wie die Markierung erfolgt, wenn Sie diese über ein Wort hinaus erstrecken:
- True: Alle beteiligten Wörter werden komplett markiert.
- False: Es werden nur die beteiligten Zeichen markiert.
Das bedeutet: Wenn Sie beispielsweise die Einfügemarke in der Mitte eines Wortes platzieren und die Markierung dann etwa bei gedrückter Umschalttaste so erweitern, dass Sie auch noch mindestens einen Buchstaben des benachbarten Wortes markieren, dann werden automatisch beide Wörter komplett markiert (Einstellung: True).
Markierung auch bei Fokusverlust beibehalten
Sehr wichtig ist die Eigenschaft HideSelection. Wenn diese, wie standardmäßig vorgesehen, den Wert True aufweise, wird die aktuelle Markierung im TextBox-Element nicht mehr angezeigt, wenn das Steuer-element den Fokus verliert. Stellen Sie HideSelection hingegen auf False ein, bleibt die Markierung auch bei Fokusverlust erhalten.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo