{"id":55001379,"date":"2022-08-01T00:00:00","date_gmt":"2022-08-04T18:11:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1379"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Textfeld_nur_mit_bestimmten_Zeichen_fuellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/","title":{"rendered":"Textfeld nur mit bestimmten Zeichen f&uuml;llen"},"content":{"rendered":"<p><b>Manche Felder in Tabellen d&uuml;rfen nur bestimmte Zeichen aufnehmen. So soll beispielsweise eine Postleitzahl nur aus Zahlen bestehen, Namen sollen keine Zahlen enthalten, Telefonnummern nur Zahlen und bestimmte Zeichen wie Plus, Minus und Klammern. Um dies durchzusetzen, gibt es verschiedene M&ouml;glichkeiten. Die einfachste ist, nach der Eingabe zu pr&uuml;fen, ob das Feld nur die zul&auml;ssigen Zeichen enth&auml;lt und den Benutzer darauf hinzuweisen. Man k&ouml;nnte aber auch direkt bei der Eingabe nur die zul&auml;ssigen Zeichen akzeptieren. Dabei gibt es jedoch einige Fallstricke. In diesem Beitrag schauen wir uns die verschiedenen M&ouml;glichkeiten an.<\/b><\/p>\n<h2>Pr&uuml;fung nach der Eingabe<\/h2>\n<p>Die einfachste Variante ist wohl die, direkt nach der Eingabe zu pr&uuml;fen, ob der Text nicht erlaubte Zeichen enth&auml;lt. Dazu m&uuml;ssen wir zun&auml;chst einmal definieren, welche Zeichen erlaubt sind und welche nicht. Ein einfaches Beispiel ist die Postleitzahl. Sie darf nur Zahlen enthalten, was leicht zu erreichen w&auml;re, wenn man das Feld, an das man das Textfeld zur Eingabe bindet, direkt als Zahlenfeld definieren w&uuml;rde.<\/p>\n<p>Postleitzahlen enthalten aber auch mal f&uuml;hrende Nullen, und die werden eben nur bei Verwendung eines Felddatentyps wie <b>Kurzer Text <\/b>gespeichert. Es geht zwar auch mit einem Zahlenfeld und bestimmten Formatierungen, aber sp&auml;testens beim Export in eine Textdatei, etwa zum &Uuml;bergeben von Adressen, werden standardm&auml;&szlig;ig nur die tats&auml;chlich gespeicherten Werte &uuml;bergeben.<\/p>\n<p>Wir haben eine kleine Tabelle namens <b>tblBeispielfelder <\/b>erstellt, die drei Felder namens <b>PLZ<\/b>, <b>Telefon <\/b>und <b>EMail <\/b>f&uuml;r uns als Spielmaterial enth&auml;lt. Diese binden wir &uuml;ber die Eigenschaft <b>Datensatzquelle <\/b>an ein neues Formular.<\/p>\n<p>Wir definieren als Erstes eine Konstante, die alle zul&auml;ssigen Zeichen enth&auml;lt:<\/p>\n<pre>Const cStrZahlen<span style=\"color:blue;\"> As String<\/span> = \"0123456789\"<\/pre>\n<p>Dann hinterlegen wir f&uuml;r das Ereignis <b>Vor Aktualisierung <\/b>des Textfeldes <b>txtPLZ<\/b>, das an das Feld <b>PLZ <\/b>gebunden ist, die Ereignisprozedur aus Listing 1. Diese liest den Inhalt des Textfeldes <b>txtPLZ <\/b>in die Variable <b>strPLZ <\/b>ein und ersetzt einen eventuellen Nullwert durch eine leere Zeichenkette. Dann untersucht sie in einer <b>For&#8230;Next<\/b>-Schleife alle Buchstaben der Zeichenkette <b>strPLZ<\/b>. Dabei ermittelt sie den aktuellen Buchstaben mit <b>Mid(strPLZ, i, 1) <\/b>und pr&uuml;ft dann mit der <b>InStr<\/b>-Funktion, ob dieser in der Zeichenkette aus <b>cStrZahlen <\/b>enthalten ist. Ist das nicht der Fall, liefert <b>InStr <\/b>die Position, die gleich <b>0 <\/b>ist. Dann erscheint eine entsprechende Meldung und die Eingabe wird mit <b>Cancel = True <\/b>abgebrochen &#8211; der Benutzer kann das Feld erst verlassen, wenn die Pr&uuml;fung erfolgreich ist (siehe Bild 1). Dazu kann das Feld auch vollst&auml;ndig geleert werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1379_001.png\" alt=\"Meldung nach dem Vor Aktualisierung-Ereignis\" width=\"449,5589\" height=\"264,2227\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Meldung nach dem Vor Aktualisierung-Ereignis<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPLZ<span style=\"color:blue;\"> As String<\/span>\r\n     strPLZ = Nz(Me!PLZ, \"\")\r\n     For i = 1 To <span style=\"color:blue;\">Len<\/span>(strPLZ)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, cStrZahlen, <span style=\"color:blue;\">Mid<\/span>(strPLZ, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die PLZ darf nur aus Zahlen bestehen.\", vbOKOnly + vbExclamation, \"Ung&uuml;ltige PLZ\"\r\n             Cancel = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Pr&uuml;fen der PLZ nach der Eingabe<\/span><\/b><\/p>\n<h2>Pr&uuml;fung w&auml;hrend der Eingabe<\/h2>\n<p>Die alternative Variante ist, die Zeichen direkt bei der Eingabe zu pr&uuml;fen. Dazu ben&ouml;tigen wir eine andere Ereignisprozedur, n&auml;mlich <b>Bei Taste ab<\/b>. Vorab ein Hinweis: Damit decken wir nicht alle F&auml;lle ab. Dazu jedoch sp&auml;ter mehr.<\/p>\n<p>Da wir auch erst einmal die Eingabe der Postleitzahl beschreiben wollen, kopieren wir das Feld <b>txtPLZ <\/b>in ein neues Textfeld namens <b>txtPLZ2<\/b>. F&uuml;r dieses hinterlegen wir dann die Ereignisprozedur <b>txtPLZ2_KeyDown<\/b>. Was k&ouml;nnen wir mit dem Ereignis <b>Bei Taste ab <\/b>erledigen?<\/p>\n<p>Die dadurch ausgel&ouml;ste Prozedur <b>txtPLZ2_KeyDown <\/b>ist so aufgebaut:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier sehen wir zwei Parameter:<\/p>\n<ul>\n<li><b>KeyCode<\/b>: Liefert einen Zahlenwert, der die bet&auml;tigte Taste repr&auml;sentiert.<\/li>\n<li><b>Shift<\/b>: Gibt an, ob eine der Tasten <b>Umschalt<\/b>, <b>Alt <\/b>oder <b>Strg <\/b>gedr&uuml;ckt ist.<\/li>\n<\/ul>\n<p><b>KeyCode <\/b>liefert aber nicht nur einen Zahlenwert f&uuml;r die aktuell angeklickte Taste. Sie k&ouml;nnen durch Einstellen von <b>KeyCode <\/b>auf den Wert <b>0 <\/b>auch daf&uuml;r sorgen, dass der Tastenanschlag nicht an das aktuelle Steuerelement weitergeleitet wird. Und Sie k&ouml;nnen sogar festlegen, dass statt des gedr&uuml;ckten Zeichens ein anderes Zeichen weitergegeben wird. F&uuml;r uns ist allerdings nur interessant, die Eingabe eines nicht gew&uuml;nschten Zeichens zu unterbinden, indem wir <b>KeyCode <\/b>auf <b>0 <\/b>einstellen.<\/p>\n<p>Wie finden wir heraus, welcher <b>KeyCode <\/b>welchem Zeichen entspricht, um entsprechend darauf reagieren zu k&ouml;nnen? Ganz einfach: Wir geben den <b>KeyCode <\/b>einfach im Direktbereich aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> KeyCode\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit erfahren wir durch Eingeben von Zeichen in das Feld <b>txtPLZ2 <\/b>schnell, dass die Zahlen von <b>0 <\/b>bis <b>9 <\/b>den Werten <b>48 <\/b>bis <b>57 <\/b>f&uuml;r <b>KeyCode <\/b>entsprechen. Wir k&ouml;nnen nun in einem ersten Ansatz daf&uuml;r sorgen, dass der Benutzer nur noch diese Zeichen in das Textfeld eingeben kann. Dazu pr&uuml;fen wir, ob <b>KeyCode <\/b>einen Wert von <b>48 <\/b>bis <b>57 <\/b>enth&auml;lt und falls nicht, geben wir mit dem Parameter <b>KeyCode <\/b>den Wert <b>0 <\/b>zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>48 To 57\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             KeyCode = 0\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das funktioniert genau wie angenommen: Nur die Tasten <b>0 <\/b>bis <b>9 <\/b>werden weitergeleitet und im Textfeld ausgegeben.<\/p>\n<p>Wir haben allerdings ein kleines Problem: Auch die Tasten zum Bewegen der Einf&uuml;gemarke, die Eingabetaste, die Tabulatortaste et cetera werden innerhalb des Textfeldes blockiert. Also geben wir auch solche Tasten wieder frei.<\/p>\n<p>Wie Sie herausfinden, welche KeyCodes hinter den Tasten stecken, haben wir ja bereits beschrieben. Der &Uuml;bersicht halber tragen wir die zus&auml;tzlichen Elemente in eine weitere <b>Case<\/b>-Bedingung ein:<\/p>\n<ul>\n<li><b>8<\/b>: Back<\/li>\n<li><b>9<\/b>: Tabulator<\/li>\n<li><b>13<\/b>: Eingabetaste<\/li>\n<li><b>27<\/b>: Escape<\/li>\n<li><b>37<\/b>: Cursor nach links<\/li>\n<li><b>39<\/b>: Cursor nach rechts<\/li>\n<li><b>46<\/b>: Entfernen<\/li>\n<li><b>113<\/b>: F2 (zum Aufheben von Markierungen)<\/li>\n<\/ul>\n<h2>Nummernblock ber&uuml;cksichtigen<\/h2>\n<p>Gegebenenfalls verwenden Benutzer auch den Nummernblock der Tastatur, um Zahlen einzugeben. Das m&uuml;ssen wir ber&uuml;cksichtigen, denn die <b>KeyCode<\/b>-Werte entsprechen nicht denen der normalen Zahlentasten, sondern den Zahlen von <b>96<\/b> bis <b>105<\/b>. Wir f&uuml;gen diese dem <b>Case<\/b>-Zweig f&uuml;r die normalen Zahlen hinzu:<\/p>\n<pre>        <span style=\"color:blue;\">Case <\/span>48 To 57, 96 To 105<\/pre>\n<p>Die Eingabetaste im Nummernblock hat allerdings auch den <b>KeyCode<\/b>-Wert <b>13<\/b>, sodass hier keine Erweiterung notwendig ist.<\/p>\n<p>Die vollst&auml;ndige Prozedur sieht nun wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>48 To 57, 96 To 105\r\n         <span style=\"color:blue;\">Case <\/span>8, 9, 13, 27, 37, 39, 46, 113\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             KeyCode = 0\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r bessere Lesbarkeit k&ouml;nnen wir auch die Konstanten der Enumeration <b>KeyCodeConstants<\/b> nutzen.<\/p>\n<p>Bei der Gelegenheit f&auml;llt uns noch eine Erg&auml;nzung ein: Aktuell lassen wir alle Bet&auml;tigungen der Tasten von <b>0 <\/b>bis <b>9 <\/b>zu  &#8211; und wir pr&uuml;fen noch nicht, ob der Benutzer dabei eine der Tasten <b>Umschalt<\/b>, <b>Strg <\/b>oder <b>Alt <\/b>dr&uuml;ckt. Das hei&szlig;t, dass der Benutzer die Zahlen auch bei gedr&uuml;ckter Umschalttaste eingeben kann, was die Eingabe von Ausrufezeichen, Anf&uuml;hrungszeichen und so weiter erlaubt. Wir m&uuml;ssen also im <b>Case<\/b>-Zweig f&uuml;r die Zahlen noch pr&uuml;fen, ob der Parameter <b>Shift <\/b>den Wert <b>0 <\/b>enth&auml;lt und falls nicht, das eingegebene Zeichen abfangen.<\/p>\n<p>Dann sieht die Prozedur wie in Listing 2 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>vbKey0 To vbKey9, vbKeyNumpad0 To vbKeyNumpad9\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Shift = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 KeyCode = 0\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyBack, vbKeyTab, vbKeyReturn, vbKeyEscape, vbKeyLeft, vbKeyRight, vbKeyDelete, vbKeyF2\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             KeyCode = 0\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Pr&uuml;fen der PLZ nach der Eingabe mit KeyCode-Konstanten<\/span><\/b><\/p>\n<h2>Einf&uuml;gen &uuml;ber die Zwischenablage<\/h2>\n<p>Der Fall, den wir mit dieser Methode nicht verarbeiten k&ouml;nnen, ist das Einf&uuml;gen von Texten &uuml;ber die Zwischenablage. Das hei&szlig;t, der Benutzer hat beispielsweise den Text <b>D-12345 <\/b>in die Zwischenablage kopiert, markiert dann das Textfeld <b>txtPLZ2 <\/b>und bet&auml;tigt entweder die Tastenkombination <b>Strg + V <\/b>oder den Kontextmen&uuml;befehl <b>Einf&uuml;gen<\/b>.<\/p>\n<p><!--30percent--><\/p>\n<p>Als Erstes f&auml;llt auf: Wir haben die Tastenkombination <b>Strg + V <\/b>noch gar nicht freigeschaltet. Das ist etwas aufwendiger, da wir auch noch pr&uuml;fen m&uuml;ssen, ob die <b>Strg<\/b>-Taste gleichzeitig gedr&uuml;ckt wird. Ob die <b>Strg<\/b>-Taste gedr&uuml;ckt wird, ermitteln wir wie bei der <b>Umschalt<\/b>-Taste und der <b>Alt<\/b>-Taste &uuml;ber den Parameter <b>Shift<\/b>. <b>Shift <\/b>kann die folgenden Werte annehmen, die auch kombiniert werden k&ouml;nnen:<\/p>\n<ul>\n<li><b>0<\/b>: Keine Taste gedr&uuml;ckt.<\/li>\n<li><b>1<\/b>: <b>Umschalt<\/b>-Taste<\/li>\n<li><b>2<\/b>: <b>Strg<\/b>-Taste<\/li>\n<li><b>3<\/b>: <b>Umschalt<\/b>&#8211; und <b>Strg<\/b>-Taste (<b>1 <\/b>plus <b>2<\/b>)<\/li>\n<li><b>4<\/b>: <b>Alt<\/b>-Taste<\/li>\n<li><b>5<\/b>: <b>Umschalt<\/b>&#8211; und <b>Alt<\/b>-Taste (<b>1 <\/b>plus <b>4<\/b>)<\/li>\n<li><b>6<\/b>: <b>Strg<\/b>&#8211; und <b>Alt<\/b>-Taste (<b>2 <\/b>plus <b>4<\/b>)<\/li>\n<li><b>7<\/b>: <b>Umschalt<\/b>-, <b>Strg<\/b>&#8211; und <b>Alt<\/b>-Taste (<b>1 <\/b>plus <b>2 <\/b>plus <b>4<\/b>)<\/li>\n<\/ul>\n<p>Auch hier gibt es entsprechende Konstanten. Allerdings verwenden wir nicht die der Enumeration <b>KeyCodeConstants<\/b>, sondern entsprechende Access-Konstanten:<\/p>\n<ul>\n<li><b>Umschalt<\/b>-Taste: <b>acShiftMask<\/b><\/li>\n<li><b>Strg<\/b>-Taste: <b>acCtrlMask<\/b><\/li>\n<li><b>Alt<\/b>-Taste: <b>acAltMask<\/b><\/li>\n<\/ul>\n<p>Die Bet&auml;tigung der Tastenkombination lassen wir also mit dem folgenden <b>Case<\/b>-Zweig in der <b>Select Case<\/b>-Bedingung zu:<\/p>\n<pre><span style=\"color:blue;\">Case <\/span>vbKeyC\r\n     <span style=\"color:blue;\">If <\/span>Shift = acCtrlMask<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         KeyCode = 0\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Beim Bet&auml;tigen des Buchstaben <b>c <\/b>pr&uuml;fen wir also, ob der Benutzer dabei die <b>Strg<\/b>-Taste (<b>acCtrlMask<\/b>) bet&auml;tigt hat. Falls dies nicht in Kombination mit der <b>Strg<\/b>-Taste geschehen ist, wird dies mit <b>KeyCode = 0 <\/b>unterbunden.<\/p>\n<p>Aber was tun wir, wenn der Benutzer einen Text mit <b>Strg + V <\/b>einf&uuml;gt? Wir k&ouml;nnten nat&uuml;rlich an dieser Stelle den Inhalt der Zwischenablage abgreifen und untersuchen. Aber wie machen es uns ein wenig einfacher. Die L&uuml;cke f&uuml;llen wir durch das Setzen des Zeitgeberintervalls auf 100 Millisekunden:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>Shift = acCtrlMask<span style=\"color:blue;\"> Then<\/span>\r\n     Me.TimerInterval = 100\r\n...<\/pre>\n<p>Ist <b>TimerIntervall <\/b>auf einen Wert gr&ouml;&szlig;er als <b>0 <\/b>gesetzt, wird im angegebenen Intervall das Ereignis <b>Bei Zeitgeber <\/b>ausgel&ouml;st. F&uuml;r dieses hinterlegen wir die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strPLZ = Nz(Me!txtPLZ2.Text, \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strPLZ) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         For i = 1 To <span style=\"color:blue;\">Len<\/span>(strPLZ)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, cStrZahlen,  <span style=\"color:blue;\">Mid<\/span>(strPLZ, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strPLZ, i, 1)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtPLZ2 = strTemp\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Was geschieht hier? Wenn der Benutzer beispielsweise den Text <b>D-12345 <\/b>aus der Zwischenablage in das Textfeld eingeben will, erkennt die <b>KeyDown<\/b>-Ereignisprozedur, dass er <b>Strg + V <\/b>bet&auml;tigt hat. Der Text ist zu diesem Zeitpunkt aber noch nicht im Textfeld angekommen, sondern erst kurze Zeit sp&auml;ter. Daher verwenden wir die <b>Form_Timer<\/b>-Ereignisprozedur, um den eingef&uuml;gten Text auszuwerten.<\/p>\n<p>Hier schreiben wir den Text aus dem Textfeld zun&auml;chst in die Variable <b>strPLZ<\/b>. Wir k&ouml;nnen nicht auf <b>Me!txtPLZ2 <\/b>zugreifen, sondern m&uuml;ssen <b>Me!txtPLZ2.Text <\/b>nutzen, da der Text noch nicht im Textfeld gespeichert wurde.<\/p>\n<p>Danach durchlaufen wir eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Zeichen des hineinkopierten Textes und pr&uuml;fen, ob es dort andere Zeichen als die Zahlen von <b>0 <\/b>bis <b>9 <\/b>gibt. Nur diese Zahlen werden an eine neue Zeichenkette namens <b>strTemp <\/b>angeh&auml;ngt. Wir pr&uuml;fen also f&uuml;r jedes Zeichen, ob es eine Zahl ist, und &uuml;bernehmen sie dann in <b>strTemp<\/b>.<\/p>\n<p>Aus <b>D-12345 <\/b>in <b>strPLZ <\/b>wird also <b>12345 <\/b>in <b>strTemp<\/b>. Diesen Wert schreiben wir dann zur&uuml;ck in das Textfeld.<\/p>\n<h2>Was geschieht beim Einf&uuml;gen per Kontextmen&uuml;?<\/h2>\n<p>Es gibt auch noch die M&ouml;glichkeit, dass der Benutzer den Inhalt der Zwischenablage &uuml;ber den Befehl <b>Einf&uuml;gen <\/b>aus dem Kontextmen&uuml; in das Textfeld kopieren will. Entwickler nutzen vermutlich &uuml;berwiegend die Tastenkombination <b>Strg + V<\/b>, aber normale Benutzer verwenden vermutlich durchaus noch solche Kontextmen&uuml;-Befehle.<\/p>\n<p>Wir k&ouml;nnen zwar den Rechtsklick auf das Textfeld abfangen, aber wir k&ouml;nnen nicht herausfinden, ob der Benutzer den Befehl <b>Einf&uuml;gen <\/b>aus dem Kontextmen&uuml; ausw&auml;hlt.<\/p>\n<p>Was dann? In diesem Fall wird zwar nicht das Ereignis <b>Bei Taste ab <\/b>ausgel&ouml;st, aber das Ereignis <b>Bei &Auml;nderung<\/b>. Dieses k&ouml;nnen wir wieder nutzen, indem wir den ge&auml;nderten Text untersuchen und nicht erlaubte Zeichen entfernen.<\/p>\n<p>Die Prozedur <b>txtPLZ2_Change <\/b>sieht schlie&szlig;lich wie in Listing 3 aus und enth&auml;lt bis auf das Zur&uuml;cksetzen des Zeitgeberintervalls die gleichen Anweisungen wie <b>Form_Timer<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strPLZ = Nz(Me!txtPLZ2.Text, \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strPLZ) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         For i = 1 To <span style=\"color:blue;\">Len<\/span>(strPLZ)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, cStrZahlen, <span style=\"color:blue;\">Mid<\/span>(strPLZ, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strPLZ, i, 1)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtPLZ2 = strTemp\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Entfernen ung&uuml;ltiger Zeichen bei &Auml;nderung des Textfeldinhalts<\/span><\/b><\/p>\n<p>Das Problem ist, dass nun bei jeder &Auml;nderung, also auch beim einfachen Eintippen oder Entfernen von Zeichen, der aktuelle Text des Textfeldes analysiert und anschlie&szlig;end der bereinigte Text wieder eingef&uuml;gt wird. Dies interpretiert Access als erneuten Eintritt in das Feld, wodurch ein bestimmtes Verhalten der Einf&uuml;gemarke ausgel&ouml;st wird. Dieses Verhalten ist in den Access-Optionen in dem Bereich aus Bild 2 festgelegt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1379_002.png\" alt=\"Einstellung f&uuml;r das Cursorverhalten bei Eintritt in ein Feld\" width=\"524,559\" height=\"318,6209\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einstellung f&uuml;r das Cursorverhalten bei Eintritt in ein Feld<\/span><\/b><\/p>\n<p>In unserem Fall wird der komplette Feldinhalt markiert, was beispielsweise beim L&ouml;schen des letzten Zeichens der Zeichenfolge <b>47137 <\/b>dazu f&uuml;hrt, dass die verbleibenden Zeichen <b>4713 <\/b>komplett markiert werden (siehe Bild 3). Wollte der Benutzer nun die letzten beiden Zeichen mit der <b>Back<\/b>-Taste entfernen, entfernt er erst das letzte und dann alle anderen, die nach dem Entfernen des letzten Zeichens komplett markiert wurden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1379_00&sect;.png\" alt=\"Unerw&uuml;nschtes Markieren des Inhalts\" width=\"424,5589\" height=\"190,8568\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Unerw&uuml;nschtes Markieren des Inhalts<\/span><\/b><\/p>\n<p>Aber auch beim Einf&uuml;gen von Zeichen ist dieses Verhalten mehr als hinderlich. Will der Benutzer <b>47137 <\/b>eintippen, tippt er die <b>4<\/b>, die sodann markiert wird, was dazu f&uuml;hrt, dass das markierte Zeichen bei Eingabe des folgenden Zeichens wieder gel&ouml;scht wird.<\/p>\n<p>Etwas besser wird es, wenn wir nicht mehr dem Textfeld direkt die gepr&uuml;fte Zeichenkette zuweisen, sondern der Eigenschaft <b>Text<\/b> des Textfeldes:<\/p>\n<pre>Me!txtPLZ2.Text = ZeichenPruefen(Me!txtPLZ2, cStrZahlen)<\/pre>\n<p>Damit landet die Einf&uuml;gemarke allerdings immer am Ende des eingef&uuml;gten Textes. Das f&uuml;hrt zum Beispiel zu Problemen, wenn der Benutzer Zeichen mitten im Text hinzuf&uuml;gen will &#8211; die Einf&uuml;gemarke springt nach Eingabe des ersten Zeichens direkt ans Ende.<\/p>\n<p>Das Verhalten ist nur akzeptabel, wenn der Benutzer tats&auml;chlich den Inhalt der Zwischenablage in das Textfeld einf&uuml;gen will.<\/p>\n<p>Die bisher beschriebenen Beispiele finden Sie im Formular <b>frmZeichenInTextfeldern<\/b>, die folgenden in <b>frmZeichen-InTextfeldern_2<\/b>.<\/p>\n<h2>Bei &Auml;nderung nicht bei Tastendruck ausl&ouml;sen<\/h2>\n<p>Ein Weg, dies zu umgehen, ist Folgender. Wir wollen verhindern, dass die Prozedur <b>txtPLZ2_Change <\/b>ausgel&ouml;st wird, wenn der Benutzer einfach nur Zeichen eingibt. <b>txtPLZ2_Change <\/b>soll nur feuern, wenn der Benutzer per <b>Einf&uuml;gen<\/b>-Befehl Daten aus der Zwischenablage einf&uuml;gt. Bevor wir diese &Auml;nderung vornehmen, wollen wir den Code ein wenig aufr&auml;umen. Wir f&uuml;hren in den beiden Ereignisprozeduren <b>Form_Timer <\/b>und <b>txtPLZ2_Change <\/b>prinzipiell den gleichen Code auf. Das ruft nach einer Refactoring-Ma&szlig;nahme. Dabei gliedern wir die redundanten Anweisungen in eine eigene Prozedur aus, hier <b>ZeichenPruefen<\/b> (siehe Listing 4). Die Prozedur erwartet einen Verweis auf das zu untersuchende <b>TextBox<\/b>-Element als ersten und eine Zeichenkette mit den zul&auml;ssigen Zeichen als zweiten Parameter. Dazwischen erledigt sie die Schritte, die wir bereits weiter oben erl&auml;utert haben &#8211; und weist anschlie&szlig;end das Ergebnis der <b>Text<\/b>-Eigenschaft des Textfeldes aus <b>txt <\/b>zu.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ZeichenPruefen(txt<span style=\"color:blue;\"> As <\/span>TextBox, strGueltigeZeichen<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZeichenkette<span style=\"color:blue;\"> As String<\/span>\r\n     strZeichenkette = Nz(txt.Text)\r\n     For i = 1 To <span style=\"color:blue;\">Len<\/span>(strZeichenkette)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, strGueltigeZeichen, <span style=\"color:blue;\">Mid<\/span>(strZeichenkette, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strZeichenkette, i, 1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     txt.Text = strTemp\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Pr&uuml;fen einer Zeichenkette auf unerlaubte Zeichen<\/span><\/b><\/p>\n<p>Die Aufrufe in den beiden Prozeduren <b>Form_Timer <\/b>und dem <b>Change<\/b>-Ereignis des Textfeldes gestalten wir nun wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     ZeichenPruefen Me!txtPLZ2, cStrZahlen\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_Change()\r\n     ZeichenPruefen Me!txtPLZ2, cStrZahlen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Zur&uuml;ck zum Beheben des Problems mit den Markierungen beim Ausl&ouml;sen des <b>Change<\/b>-Ereignisses. Wir legen die folgende Variable fest:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>bolKeyDown<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Diese stellen wir im <b>Bei Taste ab<\/b>-Ereignis auf <b>True <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     ...\r\n     bolKeyDown = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im Ereignis <b>Bei Taste auf <\/b>stellen wir <b>bolKeyDown <\/b>wieder auf <b>False <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>,  Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     bolKeyDown = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ereignis <b>Bei &Auml;nderung <\/b>wird genau zwischen den beiden Ereignissen <b>Bei Taste ab <\/b>und <b>Bei Taste auf <\/b>ausgel&ouml;st. Wir k&ouml;nnen hier also nun pr&uuml;fen, welchen Wert <b>bolKeyDown <\/b>hat. Wenn <b>bolKeyDown <\/b>den Wert <b>True <\/b>hat, wurde die &Auml;nderung durch einen Tastendruck ausgel&ouml;st.<\/p>\n<p>Wenn nicht, war das Einf&uuml;gen per Kontextmen&uuml; &uuml;ber die Zwischenablage verantwortlich. Nur in diesem Fall wollen wir dann die Prozedur <b>ZeichenPruefen <\/b>aufrufen. Also passen wir die Prozedur <b>txtPLZ2_Change <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPLZ2_Change()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolKeyDown<span style=\"color:blue;\"> Then<\/span>\r\n         ZeichenPruefen Me!txtPLZ2, cStrZahlen\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Einf&uuml;gemarke wird in jedem Fall hinten eingef&uuml;gt, da wir den Text nach der Pr&uuml;fung der <b>Text<\/b>-Eigenschaft des Textfeldes zuweisen.<\/p>\n<h2>Textfelder f&uuml;r Telefonnummern vorbereiten<\/h2>\n<p>Wenn Sie nun ein Feld f&uuml;r die Eingabe von Telefonnummern auf &auml;hnliche Weise vorbereiten wollen, sind dazu nur wenige Anpassungen n&ouml;tig. Wir schauen uns das anhand des Textfelds <b>txtTelefon <\/b>an.<\/p>\n<p>Die Unterschiede liegen in den erlaubten Zeichen. W&auml;hrend wir bei der PLZ nur die Zeichen von <b>0 <\/b>bis <b>9 <\/b>erlauben wollen, soll die Telefonnummer auch das Plus-Zeichen, das Minus-Zeichen sowie Klammern erlauben:<\/p>\n<pre>+(203)123456-1<\/pre>\n<p>Daher erstellen wir zun&auml;chst eine neue Konstante mit den zul&auml;ssigen Zeichen f&uuml;r Telefonnummern:<\/p>\n<pre>Const cStrZahlenTelefon<span style=\"color:blue;\"> As String<\/span> = \"0123456789+-()\"<\/pre>\n<p>Des Weiteren legen wir die gleichen Ereignisprozeduren an wie f&uuml;r das <b>PLZ<\/b>-Feld, also f&uuml;r <b>Bei Taste ab<\/b>, <b>Bei Taste <\/b>auf und <b>Bei &Auml;nderung<\/b>.<\/p>\n<p>Die neue Konstante verwenden wir beim Aufruf der Prozedur <b>ZeichenPruefen<\/b> aus dem Ereignis <b>txtTelefon_Change <\/b>heraus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtTelefon_Change()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolKeyDown<span style=\"color:blue;\"> Then<\/span>\r\n         ZeichenPruefen Me!txtTelefon, cStrZahlenTelefon\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Au&szlig;erdem passen wir die Prozedur an, die durch das Ereignis <b>Bei Taste ab <\/b>ausgel&ouml;st wird (siehe Listing 5). Hier erweitern wir den ersten <b>Case<\/b>-Zweig um die beiden Zeichen Plus und Minus. Interessanterweise k&ouml;nnen wir nicht die beiden Konstanten <b>vbKeyAdd <\/b>und <b>vbKeySubtract <\/b>nutzen, welche den Werten <b>107 <\/b>und <b>109 <\/b>entsprechen. Tats&auml;chlich ermitteln wir f&uuml;r diese Zeichen die Werte <b>187 <\/b>und <b>189<\/b>, f&uuml;r die es keine <b>KeyCode<\/b>-Konstante gibt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtTelefon_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>vbKey0 To vbKey9, vbKeyNumpad0 To vbKeyNumpad9, 187, 189\r\n             Select Case KeyCode\r\n                 <span style=\"color:blue;\">Case <\/span>vbKey8, vbKey9\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Shift = 0<span style=\"color:blue;\"> Then<\/span>\r\n                         KeyCode = 0\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyBack, vbKeyTab, vbKeyReturn, vbKeyEscape, vbKeyLeft, vbKeyRight, vbKeyDelete, vbKeyF2\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyV\r\n             <span style=\"color:blue;\">If <\/span>Shift = acCtrlMask<span style=\"color:blue;\"> Then<\/span>\r\n                 Me.TimerInterval = 100\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 KeyCode = 0\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             KeyCode = 0\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     bolKeyDown = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Pr&uuml;fen einer Zeichenkette auf unerlaubte Zeichen in Telefonnummern<\/span><\/b><\/p>\n<p>Innerhalb dieses <b>Case<\/b>-Zweiges unterscheiden wir nochmal zwischen den beiden Zeichen <b>vbKey8 <\/b>und <b>vbKey9<\/b>, also den Zahlen <b>8 <\/b>und <b>9<\/b>, die bei gedr&uuml;ckter Umschalttaste die Zeichen <b>( <\/b>und <b>) <\/b>liefern. Diese sollen erlaubt sein, f&uuml;r alle anderen Kombinationen von Zahlen mit einer der Tasten <b>Umschalt<\/b>, <b>Strg <\/b>und <b>Alt <\/b>liefern wir den Wert <b>0 <\/b>f&uuml;r den Parameter <b>KeyCode<\/b> zur&uuml;ck und blockieren diese somit.<\/p>\n<h2>Ereignisprozedur f&uuml;r Bei Zeitgeber anpassen<\/h2>\n<p>Eine Aufgabe haben wir noch in der Prozedur <b>Form_Timer<\/b>. Diese geht bisher davon aus, dass wir das Textfeld <b>txtPLZ2 <\/b>untersuchen. Allerdings wollen wir das Ereignis auch f&uuml;r <b>txtTelefon <\/b>nutzen &#8211; und gegebenenfalls auch noch f&uuml;r andere Felder.<\/p>\n<p>Wenn wir aktuell mit <b>Strg + V <\/b>eine Zeichenkette aus der Zwischenablage in <b>txtTelefon <\/b>einf&uuml;gen, greift die aufgerufene Prozedur <b>Form_Timer <\/b>noch auf <b>txtPLZ2 <\/b>zu, was zu einem Fehler f&uuml;hrt. Also passen wir <b>Form_Timer <\/b>wie folgt an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     Select Case Screen.ActiveControl.Name\r\n         <span style=\"color:blue;\">Case <\/span>\"txtPLZ2\"\r\n             ZeichenPruefen Me!txtPLZ2, cStrZahlen\r\n         <span style=\"color:blue;\">Case <\/span>\"txtTelefon\"\r\n             ZeichenPruefen Me!txtTelefon, cStrZahlenTelefon\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir finden hier mit <b>Screen.ActiveControl.Name <\/b>den Namen des aktuell verwendeten Textfeldes heraus und verarbeiten diesen in der <b>Select Case<\/b>-Anweisung.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Wenn man bestimmte Zeichen zu jedem Zeitpunkt der Eingabe unterbinden m&ouml;chte, ist VBA-Programmierung verschiedener Ereignisse n&ouml;tig. Der Aufwand ist nur einmalig zu betreiben und sorgt daf&uuml;r, dass die Benutzer weniger fehlerhafte Daten eingeben k&ouml;nnen.<\/p>\n<p>Wir haben dem Beispiel noch die Prozeduren f&uuml;r die Eingabe von E-Mail-Adressen hinzuf&uuml;gt. Diese erlauben die Zeichen von <b>a<\/b>&#8211;<b>z<\/b>, <b>A<\/b>&#8211;<b>z<\/b>, <b>0<\/b>&#8211;<b>9<\/b> sowie <b>@<\/b>, <b>&#8211;<\/b>, <b>_<\/b> und den Punkt (<b>.<\/b>). Interessant daran war noch, dass f&uuml;r das <b>@<\/b>-Zeichen, das bei gedr&uuml;ckter <b>Alt Gr<\/b>-Schaltfl&auml;che erzeugt wird, der <b>Shift<\/b>-Parameter des <b>KeyDown<\/b>-Ereignisses als <b>acAltMask + acCtrlMask <\/b>ausgewertet werden muss.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>EingabeInTextfeldEinschraenken.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/4777B400-B5A0-4E66-87D6-2336E1923293\/aiu_1379.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manche Felder in Tabellen d&uuml;rfen nur bestimmte Zeichen aufnehmen. So soll beispielsweise eine Postleitzahl nur aus Zahlen bestehen, Namen sollen keine Zahlen enthalten, Telefonnummern nur Zahlen und bestimmte Zeichen wie Plus, Minus und Klammern. Um dies durchzusetzen, gibt es verschiedene M&ouml;glichkeiten. Die einfachste ist, nach der Eingabe zu pr&uuml;fen, ob das Feld nur die zul&auml;ssigen Zeichen enth&auml;lt und den Benutzer darauf hinzuweisen. Man k&ouml;nnte aber auch direkt bei der Eingabe nur die zul&auml;ssigen Zeichen akzeptieren. Dabei gibt es jedoch einige Fallstricke. In diesem Beitrag schauen wir uns die verschiedenen M&ouml;glichkeiten an.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66042022,44000023],"tags":[],"class_list":["post-55001379","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Textfeld nur mit bestimmten Zeichen f&uuml;llen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Textfeld nur mit bestimmten Zeichen f&uuml;llen\" \/>\n<meta property=\"og:description\" content=\"Manche Felder in Tabellen d&uuml;rfen nur bestimmte Zeichen aufnehmen. So soll beispielsweise eine Postleitzahl nur aus Zahlen bestehen, Namen sollen keine Zahlen enthalten, Telefonnummern nur Zahlen und bestimmte Zeichen wie Plus, Minus und Klammern. Um dies durchzusetzen, gibt es verschiedene M&ouml;glichkeiten. Die einfachste ist, nach der Eingabe zu pr&uuml;fen, ob das Feld nur die zul&auml;ssigen Zeichen enth&auml;lt und den Benutzer darauf hinzuweisen. Man k&ouml;nnte aber auch direkt bei der Eingabe nur die zul&auml;ssigen Zeichen akzeptieren. Dabei gibt es jedoch einige Fallstricke. In diesem Beitrag schauen wir uns die verschiedenen M&ouml;glichkeiten an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T18:11:56+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Textfeld nur mit bestimmten Zeichen f&uuml;llen\",\"datePublished\":\"2022-08-04T18:11:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/\"},\"wordCount\":2951,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"4\\\/2022\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/\",\"name\":\"Textfeld nur mit bestimmten Zeichen f&uuml;llen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-04T18:11:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Textfeld nur mit bestimmten Zeichen f&uuml;llen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Textfeld nur mit bestimmten Zeichen f&uuml;llen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/","og_locale":"de_DE","og_type":"article","og_title":"Textfeld nur mit bestimmten Zeichen f&uuml;llen","og_description":"Manche Felder in Tabellen d&uuml;rfen nur bestimmte Zeichen aufnehmen. So soll beispielsweise eine Postleitzahl nur aus Zahlen bestehen, Namen sollen keine Zahlen enthalten, Telefonnummern nur Zahlen und bestimmte Zeichen wie Plus, Minus und Klammern. Um dies durchzusetzen, gibt es verschiedene M&ouml;glichkeiten. Die einfachste ist, nach der Eingabe zu pr&uuml;fen, ob das Feld nur die zul&auml;ssigen Zeichen enth&auml;lt und den Benutzer darauf hinzuweisen. Man k&ouml;nnte aber auch direkt bei der Eingabe nur die zul&auml;ssigen Zeichen akzeptieren. Dabei gibt es jedoch einige Fallstricke. In diesem Beitrag schauen wir uns die verschiedenen M&ouml;glichkeiten an.","og_url":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-04T18:11:56+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Textfeld nur mit bestimmten Zeichen f&uuml;llen","datePublished":"2022-08-04T18:11:56+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/"},"wordCount":2951,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","4\/2022","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/","url":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/","name":"Textfeld nur mit bestimmten Zeichen f&uuml;llen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-04T18:11:56+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Textfeld_nur_mit_bestimmten_Zeichen_fuellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Textfeld nur mit bestimmten Zeichen f&uuml;llen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001379"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001379\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}