Non è molto documentato ma in una casella di testo è possibile intercettare i tasti e comportarsi di conseguenza.
Gli eventi che ci permettono di intercettare i tasti (siano essi stampabili che di semplice controllo) sono prevalentemente questi:
KeyDown con argomento KeyCode
KeyUp con argomento KeyCode
KeyPress con argomento KeyAscii
Come vedete siamo alle prese con i codici dei tasti che vengono premuti.
Senza dilungarci troppo vediamo subito un esempio.
Con questo Test riusciremo a vedere i codici Ascii ed Unicode nentre scriviamo in una casella di testo. Mentre scriviamo nella TextBox6, nella TextBox7 verranno visualizzati i codici KeyCode e nella TextBox8 i codici KeyAscii.
Un elenco completo dei KeyCode o Costanti dei tasti li vediamo in questa pagina
mentre l'elenco completo dei KeyAscii li troveremo in questa pagina
o in quest'altra
.
Cominciamo col costruire una userform simile a questa (per questo test ci serviranno solo le TextBox6, TextBox7 e TextBox8). Il resto ci servirà dopo.
Finito di costruire (disegnare) la nostra UserForm facciamo un doppio clic sulla casella di testo denominata TextBox6
veniamo a trovarci in questa situazione: il TextBox6_Change è di default.
Di questa casella di testo ci servono questi due eventi: TextBox6_KeyDown e TextBox6_KeyPress
Perciò andiamo nella casella routine, che si trova in alto a destra dell'editor VBA, e scegliamo, uno alla volta, i due eventi che in questa immagine sono arbitrariamente selezionati assieme.
In questi due eventi scriviamo questo semplice codice:
Private Sub TextBox6_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
TextBox7 = KeyCode
End Sub
Private Sub TextBox6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox8 = KeyAscii
End Sub
In pratica quando scriviamo qualche cosa nella TextBox6, nella TextBox7 verrà scritto il KeyCode relatico al tasto premuto, e nella TextBox8 il KeyAscii come si vede in questa immagine
Se però, invece dei caratteri stampabili, premiamo altri tasti (le frecce, i tasti funzione, canc, del, ecc) vedremo lavorare solo l'evento KeyDown in quanto la TextBox7 continuerà ad aggiornarsi, mentre la TextBox8 rimarrà congelata sull'ultimo carattere stampabile premuto.
Dopo questo test possiamo passare all'argomento di questa discussione:
Controllare che in una casella di testo venga scritto quel che ci aspettiamo
Vediamo ora i vari casi che propongo con questa UserForm
Vediamo come ci comportiamo. (il codice completo lo vediamo in questa pagina
). In linea di massima effettuiamo tutti i nostri controlli basandoci sull'argomento KeyAscii che accompagna l'evento KeyPress delle TextBox).
Select Case KeyAscii
Case 48 To 57 ' vengono accettati solo i caratteri numerici
Case Else
KeyAscii = 0 ' gli altri caratteri vengono rifiutati
End Select
Nota:
nel codice possiamo notare che nel caso di caratteri validi non vengono eseguite azioni, mentre se il carattere è da rifiutare viene eseguita l'istruzione: KeyAscii = 0 che equivale a riportare il codice relativo al pulsante premuto a 0 (zero), quindi il carattere equivalente non viene semplicemente scritto.
Caselle di testo 1 e 2 (nome e cognome)
Usiamo l'evento TextBox1_KeyPress per accettare i soli caratteri alfabetici e le vocali accentate
in questa routine controlliamo che i tasti premuti corrispondano ai soli caratteri alfabetici, maiuscoli e minuscoli ed al carattere apice (apostrofo)
Casella di testo 3 (CAP)
Usiamo l'evento TextBox3_KeyPress e l'evento TextBox3_BeforeUpdate
col primo evento controlliamo che i tasti premuti corrispondano ai soli caratteri numerici
col secondo evento controlliamo anche il numero di cifre inserite (5 cifre per il CAP)
Casella di testo 4 (Telefono)
Usiamo l'evento TextBox4_KeyPress e l'evento TextBox4_BeforeUpdate
col primo evento controlliamo che i tasti premuti corrispondano ai soli caratteri numerici oltre al separatore (tra prefisso e numero) rappresentato dal carattere trattino ( - )
col secondo evento viene eseguito anche un controllo per verificare la presenza di uno ed un solo trattino
Casella di testo 5 (Data)
Usiamo l'evento TextBox5_KeyPress e l'evento TextBox5_BeforeUpdate
col primo evento controlliamo che i tasti premuti corrispondano ai soli caratteri numerici oltre al separatore tra i vari elementi della data del carattere "/"
col secondo evento viene eseguito anche un controllo per verificare la presenza di due e due soli /
Dalla routine
scritta nel modulo relativo alla UserForm vediamo che, per rifiutare un tasto, usiamo la forma:
KeyAscii = 0
Se il carattere premuto non è valido per quella casella di testo, assumendo il valore 0 (zero) annulla la pressione e quindi la visualizzazione del carattere.
In una casella di testo è possibile formattare il contenuto. L'esempio che riporto riguarda l'inserimento di un separatore di migliaia per i numeri che vanno oltre il 999 (1.000, 12.345, 123.456, ecc)
Potrei usare una qualsiasi altra formattazione (numero di decimali, fata, ora, ecc) ma siccome abbiamo un gruppo abbastanza numeroso di formati che potremmo usare vi dico subito che la sintassi di tutti questi formati la potete scoprire usando il registratore di macro ed applicarli dove volete. Poi applicate il formato come nell'esempio che segue.
La sintassi da usare per applicare un determinato formato ad una casella di testo può essere la seguente:
TextBox1 = Format(TextBox1, "#,##0.00")
Questo formatta il numero aggiungendo il separatore per le migliaia ed accetta due cifre decimali
TextBox2 = Format(TextBox2, "#,##0")
Quest'altro invece non accetta alcun decimale
Volevo effettuare la formattazione usando l'evento KeyPress della Textbox (l'evento che si genera durante la pressione del tasto), ma ho notato che non è l'evento giusto. Il risultato non è assolutamente accettabile.
Per cui ho optato di usare un altro evento: AfterUpdate (l'evento che si ottiene mentre si esce dalla TextBox.
L'istruzione da usare è questa:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1 = Format(TextBox1, "#,##0.000")
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44
Case 46
KeyAscii = 44
Case Else
KeyAscii = 0
End Select
End Sub
in questo codice notiamo che
Dopo aver applicato la formattazione il risultato nella TextBox sarà questo: 123.456,230
Nella UserForm che ho usato per questo esempio ho usato anche un controllo MaskEdBox. Il controllo, se presente nel nostro sistema, viene individuato nella cartella C:\WINDOWS\system32 e si chiama msmask32.ocx.
Il controllo MaskEdit permette di definire una maschera che deve essere rispettata e impedisce di passare ad un altro controllo fino a quando la maschera non è rispettata.
Questo controllo può farci risparmiare molto codice altrimenti necessario per eseguire dei controlli sull'input dell'utente e può essere trattato come una normale TextBox, o quasi.
In più di una TextBox ha che può essere pre-inizializzata usando la sua Proprietà Mask nella finestra Proprietà o da codice.
Per utilizzare questo controllo eseguire questi tre passi:
clic destro del mouse sulla barra degli strumenti e scegliere Controlli aggiuntivi
dalla finestra che vien fuori scegliere Microsoft Masked Edit control, version 6 (o quella disponibile con la verisone di Excel)
fatta questa scelta abbiamo il controllo MaschEdit disponibile sulla barra degli strumenti
Per inizializzare questo controllo si può usare uno dei due metodi:
Questo è un possibile codice:
Private Sub UserForm_Activate()
MaskEdBox1.Mask = "##/##/####"
'MaskEdBox2.Mask = "#####"
End Sub
Questi che seguono sono alcune maschere che si possono attribuire al controllo MaskEdBox prese dalla guida in linea:
| Maschera | Descrizione |
|---|---|
| Stringa nulla | (Predefinita) Nessuna maschera. Il controllo ha le stesse funzioni del controllo casella di testo standard. |
| ##-???-## | Formato data medio (US). Esempio: 20-May-92 |
| ##-##-## | Formato data breve (US). Esempio: 05-20-92 |
| ##:## ?? | Formato ora medio. Esempio: 05.36 AM |
| ##:## | Formato ora breve. Esempio: 17.23 |
e questo è un elenco dei caratteri che si possono usare nella costruzione di una maschera per la MaskEdBox
| Carattere | Descrizione |
| # | Segnaposto per cifre. |
| . | Segnaposto decimale. Viene utilizzato il carattere impostato come separatore dei decimali nella sezione Impostazioni internazionali. Questo carattere viene considerato come letterale ai fini della definizione della maschera. |
| , | Separatore delle migliaia. Viene utilizzato il carattere impostato come separatore dei decimali nella sezione Impostazioni internazionali. Questo carattere viene considerato come letterale ai fini della definizione della maschera. |
| : | Separatore dell'ora. Viene utilizzato il carattere impostato come separatore dei decimali nella sezione Impostazioni internazionali. Questo carattere viene considerato come letterale ai fini della definizione della maschera. |
| / | Separatore della data. Viene utilizzato il carattere impostato come separatore dei decimali nella sezione Impostazioni internazionali. Questo carattere viene considerato come letterale ai fini della definizione della maschera. |
| \ | Fa in modo che il carattere successivo venga considerato come letterale. Ciò consente di includere nella maschera i caratteri '#', '&', 'A' e '?'. Questo carattere viene considerato come letterale ai fini della definizione della maschera. |
| & | Segnaposto di carattere. Per il segnaposto sono validi i seguenti intervalli di caratteri ANSI: 32-126 e 128-255. |
| > | Converte tutti i caratteri successivi in maiuscole. |
| < | Converte tutti i caratteri successivi in minuscole. |
| A | Segnaposto per caratteri alfanumerici (immissione obbligatoria). Ad esempio: a – z, A – Z, oppure 0 – 9. |
| a | Segnaposto per caratteri alfanumerici (immissione facoltativa). |
| 9 | Segnaposto per cifre (immissione facoltativa). Ad esempio: 0 – 9. |
| C | Segnaposto per carattere o spazio (immissione facoltativa). Funziona esattamente come il segnaposto & e garantisce la compatibilità con Microsoft Access. |
| ? | Segnaposto per lettere. Ad esempio: a – z oppure A – Z. |
| Letterale | Tutti gli altri simboli vengono visualizzati come letterali, ovvero così come sono. |
Per questa volta penso possa bastare.