Le Date: usare il controllo ActiveX "Masked Edit Control". - pagina vista: volte In questo articolo vedremo come poter eseguire una verifica se una data viene scritta in maniera corretta, rispettando cioè la sintassi italiana che prevede di scrivere prima i giorni, poi un separatore (una barra o una lineetta), poi il mese, il separatore, infine l'anno, che potrà essere indicato in forma breve (a due cifre) o estesa (a quattro cifre), esempio 15/12/04 oppure 15/12/2004 (giorno 15/ mese 12/ anno 04 o 2004). Userò la barra "/" come separatore e l'anno a due cifre negli esempi che faremo. Tra i vari errori di scrittura che si possono verificare, troviamo:
Per l'anno non esiste nessuna possibilità di verifica (a meno che non si definiscano istruzioni che delimitino l'anno minimo o massimo introducibile), infatti, a meno che non si inserisca un anno superiore a 9999, sia Excel sia il vba considerano valido l'anno introdotto, anche se abbiamo errato, scrivendo 15/12/2014 mentre volevamo scrivere 15/12/2004. Ora, se usiamo celle del foglio di lavoro ovviamente impostate come formato cella a : data, e sbagliamo nello scrivere una data, Excel ci evidenzia l'errore spostando la data così scritta a sinistra nella cella (la considera "testo", non più data) anzichè metterla a destra nella cella, come fa con le date, ma se usiamo scrivere date in una (o più) TextBox poste su UserForm, queste non reagiscono, lasciandoci l'errore di scrittura, e poi troveremo problemi quando lavoreremo con una data che data non è, magari passandola ad una cella di un foglio di lavoro. Purtroppo per noi, le verifiche di una data, basate su istruzioni che prevedano l'utilizzo di IsDate o di gestione degli errori (On Error GoTo.. opp. If Err.Number = ecc.), o ancora di controllo della posizione dei separatori con Mid, Left, Right (tutti già visti in altri articoli sul tema Data, sui due siti ennius) non intercettano tutti gli errori di scrittura possibili, ma intervengono solo se si verifica un determinato tipo di errore di scrittura, e lasciano passare altri non previsti dalle specifiche istruzioni. Inoltre alcuni tipi di errori di scrittura, per effetto del diverso modo di "leggere" le date da parte del codice vba, che conosce solo il sistema inglese (mese/giorno/anno) non vengono rilevati come errori. Facciamo un esempio : noi scriviamo la data 06/13/04, dove appare evidente che il mese 13 non esiste; se inseriamo la funzione IsDate per verificare che la data scritta sia realmente una data, la data (per noi scritta errata) passerebbe in quanto il codice la legge, e non trovandola idonea ad una data scritta in italiano, la interpreta come data scritta in inglese: come 13/06/04, e quindi comunque data valida: il giorno 13 del mese di giugno esiste, ed interverrebbe solo se il giorno anzichè 06 fosse 15: in questo caso la data 15/13/04, anche letta in inglese non esisterebbe : 13/15/04 (infatti il mese 15 non esiste neppure in inglese). E questo nonostante si usi magari una "funzione di conversione del tipo", come CDate(data), o la funzione Format per formattare la data "mm/dd/yy" o "dd/mm/yy". Sebbene sia comunque possibile compilare per ogni TextBox tutta la serie di verifiche da eseguire : se la data è una data, se i mesi o i giorni non sono corrispondenti, se si verificano errori, se i separatori sono nella posizione giusta, ecc., ritengo complicato per i più, istruire decine di righe di istruzioni e uscirne vincitori, visto anche che dovremmo poter sfruttare "eventi" diversi per attivare alcune o parte di queste istruzioni. Conviene a questo punto utilizzare il controllo aggiuntivo Masked Edit Control, un "controllo ActiveX" che assomiglia ad una TextBox, ma nel quale è possibile predisporre una "maschera" per l'introduzione dati. Vediamo intanto come richiamare questo "controllo" : cliccando destro sulla "casella degli strumenti" associata ad una UserForm, scegliere la voce "Controlli Aggiuntivi", e nella finestra che appare, cercare e mettere un segno di spunta accanto alla voce "Microsoft Masked Edit Control, version 6.0" (o versione disponibile sul proprio computer) che corrisponde al file MSMASK32.OCX contenuto nella cartella System32 di Windows. Ci troveremo con questa icona aggiunta alla Casella degli strumenti e selezionandola, spostandoci sulla UserForm, potremo posizionarla e dimensionarla come una TextBox. Lo scopo di tutto questo traffico è quello di disporre di una "TextBox" dove troveremo già predisposti sia gli spazi che verranno occupati dai numeri della data che introdurremo, sia i separatori che avremo scelto: dovremo scrivere solo il giorno il mese e l'anno in successione, senza doverci preoccupare di scrivere i separatori e, ad ogni numero digitato, il cursore si posizionerà automaticamente nella posizione successiva, saltando automaticamente i separatori. Tramite questo "controllo" è possibile quindi eliminare tutti gli errori tipici fatti con i separatori. Vediamo una controllo Masked Edit Control con la maschera predisposta:
Come si vede, è stata predisposta la "maschera" per l'introduzione dei dati: i trattini bassi sono i "segnaposto" che verranno sostituiti dai numeri che digiteremo, e i "separatori" rappresentati dalle barre ( / ) ( la maschera è impostata per anno breve, a due cifre, ma sarà possibile definire l'anno a 4 cifre, dipenderà da noi). Vediamo ora quali sono le due "proprietà" del Masked Edit interessate all'impostazione della "maschera":
Fino ad ora non mi sembra molto difficile, non trovate? Ora vedremo le istruzioni compilate, però prima è necessario chiarire in quale modo identifichiamo nelle istruzioni la data che avremo scritto nel controllo MaskEdBox1, useremo:
I più attenti avranno però letto che queste due proprietà restituiscono un formato "testo" (stringa), non un formato data, dovremo quindi provvedere poi a formattare e rendere come "data" il testo immesso nel controllo. Velocemente pensiamo ora all'evento che useremo per attivare le istruzioni: io suggerisco l'evento Exit del MaskEdBox1 (questo il "nome" del primo Masked Edit Control posto su UserForm). Questo evento si verifica nel momento in cui il MaskEdBox1 perde lo stato attivo, cioè ci spostiamo su un'altro controllo presente, per esempio premendo un CommandButton. L'evento Exit è particolarmente indicato perchè possiede l'argomento Cancel che, impostato a True, ci consente di mantenere lo stato attivo sul controllo, per intervenire con correzioni, evidenziando la parte da correggere. Vediamo la routine: non vi spaventate, ho inserito tutte le verifiche possibili (tranne quelle sui "separatori", inutili visto che le "barre" sono nella maschera):
Avrei esaurito l'argomento data, e spero di aver illustrato esaurientemente come intervenire (esistono comunque altri sistemi) nel verificare l'esattezza di una data scritta. Buon lavoro. prelevato sul sito www.ennius.altervista.org |