Input controllato in una UserForm (intercettare i tasti)

Ultima modifica: 29-05-2016

 

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.

 

Primo test: visualizzazione dei codici legati al KeyAscii ed al KeyCode

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 esempio mentre l'elenco completo dei KeyAscii li troveremo in questa pagina esempio o in quest'altra esempio.

 

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.

 

Il controllo dei tasti in una TextBox

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 esempio ). 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 esempio 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.

 

La formattazione dei numeri in una casella di testo

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

In concomitanza di questo evento possiamo usare anche l'evento KeyPress della Textbox per controllare l'inserimento dei numeri, come abbiamo visto sopra.

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

  1. accettiamo i codici che vanno da 48 a 57 (per le cifre che vanno da 0 a 9),
  2. ma accettiamo anche il tasto corrispondente al KeyAscii 44 che corrisponde alla virgola
  3. ed il tasto che corrisponde al KeyAscii 46, che corrisponde al punto, lo trasformiamo in virgola (KeyAscii 44)

Dopo aver applicato la formattazione il risultato nella TextBox sarà questo: 123.456,230

 

MaskEdBox

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:

  1. Scrivere la maschera nella finestra Proprietà alla voce che indica la proprietà Mask
  2. Scrivere nel codice, in uno degli eventi di apertura:

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.