TextBox - Controllare i dati inseriti. - dal 04/09/04 pagina vista: volte

Questo articolo integra gli altri articoli sui due siti ennius in cui si parla di come usare le TextBox che mettiamo sulle UserForm. Questa volta riassumiamo le routine per controllare i dati che scriveremo in una TextBox, una sorta di "Convalida", che verifichi se il dato (o valore che dir si voglia) che abbiamo scritto corrisponda al tipo di dato che avremo deciso quella TextBox dovrà contenere.

Preciso subito che non ci stiamo occupando dell'impostazione del "Tipo di dato" attraverso una Funzione di conversione del "tipo di dati" (vedi articolo   Conversione Tipi di Dati ), quindi niente a che vedere di come il vba considererà il tipo di valore immesso, ma di come controllare se ciò che scriviamo sia un numero se vorremo siano scritti soltanto numeri e non testo, oppure controllare se una data sia scritta rispettando un certo formato, oppure se vorremo controllare di scrivere una virgola invece di un punto o viceversa, insomma un "guardiano" che ci avvisi e ci blocchi se non avremo scritto giusto.

Vediamo intanto come poter "intercettare" questi eventuali errori di battitura, sfruttando "Eventi" sia della stessa TextBox che vogliamo controllare, sia di altri "oggetti" presenti sulla stessa UserForm:

Per quanto riguarda la scelta di "Eventi" della TextBox possiamo scegliere fra gli Eventi disponibili:

  • evento Exit - si verifica quando lasciamo la TextBox, cioè togliamo il Focus dalla TextBox perchè selezioniamo un'altro "oggetto" (un controllo ActiveX: un'altra TextBox, oppure premiamo un CommandButton, ecc.), cioè quando la TextBox perde lo "stato attivo" . Sarà appunto quando si verifica questo evento, che si attivano le istruzioni che controlleranno se ciò che abbiamo scritto corrisponde a ciò che vogliamo. E' forse il sistema più pratico per effettuare il nostro controllo: ci consente di eseguire la verifica subito dopo aver completato l'inserimento dati visto che dopo questo inserimento è naturale scegliere una qualunque altra azione che toglierà il Focus (lo stato attivo) dalla TextBox. Con opportune istruzioni faremo in modo che in caso di scrittura errata, si ritorni sulla TextBox, ed evidenziare tutto il valore scritto, in modo da poter iniziare a scrivere il valore corretto senza bisogno di cancellare l'errore, ci penserà la nuova digitazione ad eliminare la scritta precedente.

  • evento KeyPress - si verifica ad ogni pressione di un tasto della tastiera e ci consente quindi di verificare durante la digitazione se ciò che scriviamo corrisponde a ciò che vogliamo, carattere dopo carattere, e di provvedere alla sostituzione del carattere errato con quello giusto.

Sconsiglio per il tipo di verifica che intendiamo effettuare, di scegliere eventi come il Change o il Click, non servirebbero al nostro scopo.

  • evento Enter - possiamo dire che si verifica quando mettiamo il Focus su un un "oggetto" (un controllo ActiveX). Possiamo sfruttare questo evento, per esempio, quando vogliamo controllare una TextBox attraverso la selezione di un'altra: selezioniamo la TextBox2 e desideriamo effettuare una verifica sulla TextBox1. Potremo usare questo evento quando l'eventuale evento Exit della TextBox1 sia già "affollato" da altre istruzioni. Lasceremo quindi il compito di controllare ciò che abbiamo scritto nella TextBox1 all'evento Enter della TextBox2. Per questo scopo possiamo sfruttare anche altri eventi, come l'

  • evento Click di un CommandButton, che si verifica nel momento in cui eseguiamo pressione sul CmdBtn stesso. In genere affidiamo a questo evento il compito di eseguire istruzioni che svolgano calcoli o che trasferiscano dati dalla UserForm ad un foglio di lavoro. E' all'inizio di queste istruzioni che inseriremo il o i controlli su TextBox per controllare l'esattezza di ciò che avremo scritto.

Prima di passare ad esaminare le istruzioni che useremo per effettuare le verifiche, è opportuno precisare una cosa: quando usiamo un'evento legato ad un'"oggetto", il compilatore ci predispone la routine legata all'evento, mettendo tra parentesi gli argomenti della funzione che abbiamo scelto; in genere questi argomenti sono proprietà che possiamo manipolare nelle impostazioni per ottenere comportamenti adeguati. Con la scelta, per esempio, dell'evento Exit di una TextBox,  vedremo che il vba ci predispone questo:

  • Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

dove viene usato di default l'argomento Cancel riferito all'oggetto TextBox1. Se nelle istruzioni noi impostiamo l'istruzione Cancel = True  noi di fatto impediamo l'uscita (la perdita di stato attivo) dalla  TextBox. Questo ci consente di restare nella TextBox1. In VBA non è possibile usare come in VB il SetFocus per restare con lo stato attivo nell'"oggetto" che abbiamo appena lasciato (stiamo infatti usando Exit al posto del VB LostFocus non previsto per il VBA), ma solo per impostare lo stato attivo su un'altro "oggetto" presente sulla UserForm. 

Controllare che si scrivano solo Numeri. Ci affidiamo alla Funzione IsNumeric per questo controllo, e scegliamo l'evento Exit della TextBox;  creiamo una condizione che verifichi se il valore riscontrato all'uscita dalla TextBox è un numero, in caso non lo sia, restiamo nella TextBox ed evidenziamo il valore:

  • Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If IsNumeric(TextBox1) = False Then 
    'se il valore non è un numero
    MsgBox "Inserire solo numeri"  
     'avvisiamo con un messaggio
    Cancel = True   
    'impediamo l'uscita dalla textbox
    TextBox1.SelStart = 0 
    'impostiamo il punto iniziale del valore da selezionare
    TextBox1.SelLength = Len(TextBox1) 
    'selezioniamo tutto il valore contenuto nella textbox1
    End If
    End Sub

Controllare che si scriva un determinato carattere o insieme di caratteri (testo). Ci affidiamo alla Funzione InStr per questo controllo e scegliamo anche qui l'evento Exit della TextBox. Creiamo una condizione che verifichi se in un ipotetico indirizzo e-mail, si sia scritta la AT (la chiocciolina), e uscendo dalla sub, selezioniamo tutto il testo in caso non compaia per correggere, avvisando con un messaggio:

  • Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If InStr(1, TextBox3, "@") = False Then
    MsgBox "Indirizzo scritto errato"
    Cancel = True
    TextBox3.SelStart = 0
    TextBox3.SelLength = Len(TextBox3)
    End If
    End Sub

Ricordo che la Funzione InStr richiede tre argomenti, nell'ordine : il primo: da quale posizione iniziare il controllo (1, inizio testo), il secondo : dove effettuare il controllo (nel testo contenuto nella TextBox3), il terzo : il valore (o carattere) da controllare posto tra doppi apici ("@"). Chiaramente potremo usare questa verifica per controllare qualsiasi combinazione di caratteri, parole o anche numeri.

Controllare che si scriva una data. - Ci affidiamo alla Funzione IsDate, e per questa verifica scegliamo ancora l'evento Exit della TextBox. E necessario comunque fare una precisazione: questo tipo di verifica interviene e ci segnala l'errore se noi scriviamo testo oppure numeri (es.: 111203 al posto di 11/02/03), ma NON segnala errore se ci scordiamo anche una sola delle barre divisorie, come potrebbe essere 11/0203, (dove manca la seconda barra), 

  • Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If IsDate(TextBox4) = False Then
    MsgBox "Inserire solo date"
    Cancel = True
    TextBox4.SelStart = 0
    TextBox4.SelLength = Len(TextBox4)
    End If
    End Sub

una soluzione alternativa possibile è quella già presentata nell'articolo "Calcolo Date in Vba 1" sull'altro sito dove sfruttiamo la Funzione Mid per verificare se le barre ( / ) separatrici della data (una data con anno a due cifre) sono al posto giusto, cioè al terzo e al sesto posto, come in 12/02/04, ed è la seguente divisa in due esempi: un esempio sfruttando l'evento Exit di una TextBox, dove come spiegato, per ritornare sulla textbox in caso di errore, usiamo Cancel per annullare l'uscita: il secondo esempio invece lo impostiamo come verifica inserita nell'evento Click di un ipotetico CommandButton che useremo per esempio per passare il contenuto di textbox sul foglio. In questo secondo esempio sarà possibile usare il SetFocus per posizionare lo stato attivo sulla textbox "incriminata", interrompendo la continuazione delle istruzioni uscendo dalla sub :

  • Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Mid(TextBox4, 3, 1) <> "/" Or Mid(TextBox4, 6, 1) <> "/" Then
    MsgBox "Scrivi la data come: 02/10/01"

    Cancel = True
    TextBox4.SelStart = 0
    TextBox4.SelLength = Len(TextBox4)
    End If
    End Sub

  • Private Sub CommandButton1_Click()
    If Mid(TextBox4, 3, 1) <> "/" Or Mid(TextBox4, 6, 1) <> "/" Then
    MsgBox "Scrivi la data come: 02/10/01"
    TextBox4 = ""
    TextBox4.SetFocus
    Exit Sub
    End If

    ...seguono istruzioni di cosa fare se la data è stata scritta giusta
    End Sub

Aiutandosi con la guida in linea sarà possibile scoprire tutte le altre Funzioni IsEmpty, IsError, IsNull ecc. ecc.da poter usare per eseguire controlli su dati e/o variabili.

Vediamo ora due routine da usarsi con l'evento KeyPress di una TextBox che si verifica quando premiamo un tasto ANSI, cioè un tasto della tastiera. Questo tipo di controllo lo useremo per controllare quindi se il tasto premuto corrisponde al tasto che vorremo, sfruttando l'argomento KeyAscii che serve ad identificare il codice Ascii corrispondente al tasto premuto. In pratica lo usiamo per sostituire con una "virgola" , l'eventuale tasto punto ( . ) premuto per errore quando vorremo scrivere decimali, come per il caso di cifre Euro:

  • Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 46 Then  
     '46 è il codice Ascii del punto e 44 della virgola
    SendKeys ",", False
    KeyAscii = 0
    End If
    End Sub

nel caso si voglia l'effetto inverso, cioè avere il punto anche se premiamo la virgola, basterà modificare queste due righe all'istruzione sopra:

  • If KeyAscii = 44 Then  
    SendKeys ".", False

Quest'altra routine può servire come esempio da sviluppare per esigenze proprie. Sfruttiamo l'evento KeyPress di una TextBox per trasferire mentre scriviamo il valore nella textbox, direttamente in una cella del foglio di lavoro, carattere dopo carattere:

  • Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    [A1] = [A1] & Chr(KeyAscii)  
    'per scrivere in una cella sul foglio attivo
    End Sub

  • Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Sheets(x).[A1] = Sheets(x).[A1] & Chr(KeyAscii) 
     'per scrivere in una cella su un foglio a "distanza" (non attivo)
    End Sub

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org