|
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
|