Domanda.

da: placido1950@interfree.it

Ciao Ennius. Per prima cosa ti ringrazio per l'attenzione che rivolgi ai pellegrini come me. Ho un problema che vorrei sottoporti:
Ho una textbox che vorrei fare cambiare colore quando digito una data sbagliata (es. 31/09/03 oppure 30/0903). Ho preparato questa istruzione:
privatesub textbox5_afterupdate()
if textbox5.value <> format (textbox5, "dd,mm,yy") then
textbox5.backcolor=&h8080ff
end if
if textbox5.value = format (textbox5, "dd,mm,yy") then
textbox5.backcolor=&hffffff
end if
risultato: se digito 31/09/03 cambia; se digito 30/0903 no.
Dove ho sbagliato?
Ciao e grazie.
 

Risposta:

salve Placido, per le prossime domande usa il modulo che trovi sui miei siti. La tua macro ha diversi errori:
primo: imposti la condizione da verificare sul formato: ma il formato (format) non identifica il "tipo" del dato, ma solo il modo di visualizzarlo.
secondo: non so che uso ne fai, ma usare un formato impostato con le virgole non ti darà mai un formato data, non ho mai visto in vba date scritte così ad esempio 10,07,03, casomai 10/07/03 opp: 10-07-03 e quindi il format diventa format (textbox5, "dd/mm/yy") opp: format (textbox5, "dd-mm-yy").
terzo: per controllare un "tipo" di dato, ti suggerisco di dare un occhiata sul sito, sezione vba, articolo "Conversione del Tipo di dati", e anche "Calcolo date in VBA 2" dove alla fine della pagina c'è un esempio di come controllare un inserimento date in una textbox.
Prova darci un occhiata, e se ancora non capisci, scrivimi,
saluti, ennius
 

Conferma di Placido.

Ciao Ennius. Ho provato a mandarti l'e-mail sottostante dal sito. Non so, però se ho seguito la giusta procedura, così ti rispondo direttamente chiedendoti anticipatamente venia per l'ulteriore disturbo.
Grazie per i suggerimenti. Nella mia e-mail avevo sbagliato la trascrizione dell'istruzione; non dd,mm,yy ma dd/mm/yy. Ho modificato tutto e sembra funzionare. All'activate del form lancio textbox5.maxlength=8 quindi
private sub textbox5_afterupdate()
if mid(textbox5,3,1)<>"/" or mid(textbox5,6,1)<>"/"then
msgbox"formato data sbagliato"
textbox5=""
exit sub
end if
dim x as date
x=format(textbox5,"dd/mm/yy")
if textbox5.value <> format(textbox5,"dd/mm/yy")then
msgbox"la data è sbagliata"
textbox5=""
end if
end sub
L'ho provata e mi da il controllo totale sulla data inserita (o almeno così penso);mi avvisa (msg2) se sbaglio la data (es.29/02/03), non mi consente più di 8 caratteri (es.29/03/2003) e mi avvisa (msg1)se ho digitato in maniera errata (es. 25/1003).
Penso che così vada bene. Che ne pensi? Grazie ancora per i preziosissimi aiuti e consigli e per avere risposto alla mia preced. e-mail in tempo...reale. Ciao.

 

Seconda Risposta.

no, dal sito non ho ricevuto nessun modulo circa questa tua. Comunque bene per le tue soluzioni. Puoi inserire più controlli per una stessa textbox. La seconda condizione comunque ti genera un errore prima ancora di arrivare ad If , SE il valore immesso non è una data, infatti l'istruzione:
dim x as date
x=format(textbox5,"dd/mm/yy")

nel caso di non data, si scontra con la dichiarazione Dim x As date che non essendo appunto una data la textbox5, genera l'errore di "tipo di dati non corretto" (esempio: 10/1003/ opp 10/10/03C o altre cose del genere).
Potresti usare IsDate, in un'istruzione tipo:
If IsDate(Textbox5) Then
cioè se textbox5 è una data, allora mi fai bianco, Else, mi fai rosso.
Ma anche questa istruzione è sibillina, infatti se tu scrivessi 101003, una data ma senza barre, il vba la considera come un numero seriale e quindi una data. Non ti scordare che ciò che noi scriviamo come date (esatte), viene
sempre convertito da codice in un numero seriale, che inizia dal 1900 ca., e conta 1 per ogni giorno trascorso da quella data. Quindi quel 101003 verrebbe identificato come una data del 2270 ca. giorno più giorno meno, ed il controllo andrebbe a farsi benedire. L'unico controllo valido che uso è la prima istruzione che hai usato, per anni a due cifre, perchè si basa sul riconoscimento delle barre che saranno sempre, per una data scritta giusta, al terzo ed al sesto posto, tutte le altre combinazioni non passano. E' evidente che una data del genere passerebbe: cc/dd/mm, ma credo che un
controllo debba essere rivolto alle sviste più comuni, come 10/1003 oppure 1010/03 oppure 10/10/203 o ancora 10/10/2003, non alle assurdità. Allora va bene aggiungere anche IsDate che con una data 10/C2/03 non passerebbe.
Comunque complimenti, continua ad imparare, saluti, ennius