PDA

Visualizza versione completa : [VBA per Excel] controllo immissione data


Gabry
19-07-2006, 12.14.32
Vorrei sottoporre alla vostra attenzione il seguente codice:

x = Len(TextBox1)
y = LTrim(TextBox1.Text)
If x = 2 Then TextBox1 = y & "/"
If x = 5 Then TextBox1 = y & "/"
If x = 10 Then
[A1] = CDate(TextBox1)
TextBox1 = ""
End If



In pratica il codice fa questo:

Nella TextBox1 digito la data solo con cifre, ad esempio 01012006. Il codice automaticamente mi immette nella cella A1 la data, ponendo le barre a rovescio tra giorno mese e anno. Vale a dire: 01/01/2006.

Funziona alla grande, se non fosse che: se sbaglio ad inserire delle date, il codice mi va in debug, mancando un controllo sulla digitazione delle date.

Ora se io erroneamente digito 32012006, effettivamente nel calendario il giorno 32 non esiste.

Allora come posso avere un controllo sul codice sopra menzionato? E quindi, invece di mandarmi in Debug, vorrei che mi segnalasse semplicemente l'errore magari ripulendo la TextBox1 e invitandomi ad inserire la data esatta.

È fattibile prima delle ferie?

Grazie a chiunque volesse aiutarmi

LoryOne
19-07-2006, 13.58.49
Utilizza la funzione isDate.
Controlla il numero di giorni validi in base al mese.
Non so però se si occupa di verificare gli anni bisestili...prova

LoryOne
19-07-2006, 14.07.04
Utilizza la funzione isDate.
Controlla il numero di giorni validi in base al mese.
Non so però se si occupa di verificare gli anni bisestili...prova

If IsDate(Format$(Text1, "00/00/00")) Then
Else
End if

Gabry
19-07-2006, 15.35.42
L'ho modificato così:

x = Len(TextBox1)
y = LTrim(TextBox1.Text)
If x = 2 Then TextBox1 = y & "/"
If x = 5 Then TextBox1 = y & "/"
If x = 10 Then

If IsDate(Format$(Text1, "00/00/0000")) Then
Else
MsgBox "La data immessa non é esatta!"
Exit Sub
End If

[A1] = CDate(TextBox1)
TextBox1 = ""
End If

Ma non mi funziona, giusto o sbagliato che si al'inserimento, mi da sempre errore.

LoryOne
19-07-2006, 17.09.47
L'errore te lo darà per quell' [A1]=CDate(Textbox1).
Supponendo che [A1] altro non sia che la cella A1, il problema si ridurrebbe a queste semplici righe:


s_Data$=Format$(TextBox1, "00/00/0000"))
If IsDate(s_Data$)= False Then
MsgBox "La data immessa non é esatta!"
Else
TextBox1=vbNullString
Range("A1").Select
Selection.Value=s_Data$
End If

LoryOne
19-07-2006, 18.09.00
If Len(TextBox1) = 8 Then

'Formatto la sequenza numerica come gg/mm/aaaa
'E' Format$ ad aggiungermi automaticamente le "/" in base
'alla maschera che ho specificato
s_Data$ = Format$(TextBox1, "00/00/0000")

'IsDate mi verifica la congruità della data nel formato specificato
If IsDate(s_Data$) = False Then
MsgBox "La data immessa non é esatta!"
Else
TextBox1 = vbNullString
Cells(1, 1).Value = s_Data$
End If
End If

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Piuttosto che effettuare il trim degli spazi a sinistra, evito che possano
'essere digitati, cioè consento solo l'inserimento dei tasti da 0 a 9
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

Gabry
20-07-2006, 07.27.50
Grazie per le indicazioni Lory, ottimo il suggerimento di limitare l'inserimento dei soli numeri.
Il problema del controllo della data da me non funziona ancora. Giusto o sbagliato che sia l'imissione della data, continua ad apparirmi il messaggio: "La data immessa non é esatta!".

LoryOne
20-07-2006, 08.05.05
Mi spiace Gabry ma temo che purtroppo dovrai andare in ferie con la data sbagliata :D

E' piuttosto improbabile che non funzioni il codice che ti ho postato ma è anche possibile che l'errore sia dovuto a parti di codice che non hai postato.
Su quale riga parte il debug ?

Gabry
20-07-2006, 09.22.22
Mi spiace Gabry ma temo che purtroppo dovrai andare in ferie con la data sbagliata :D
E' piuttosto improbabile che non funzioni il codice che ti ho postato ma è anche possibile che l'errore sia dovuto a parti di codice che non hai postato.
Su quale riga parte il debug ?


Questo é il codice completo:


Private Sub CommandButton1_Click()
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox4 = ""
TextBox5 = ""
TextBox1.SetFocus
End Sub

__________________________________________________ ______________

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Piuttosto che effettuare il trim degli spazi a sinistra, evito che possano
'essere digitati, cioè consento solo l'inserimento dei tasti da 0 a 9
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

__________________________________________________ _______________

Private Sub TextBox1_Change() 'si sfrutta l'evento Change

X = Len(TextBox1) 'si misura la lunghezza del testo nella texbox ad ogni digitazione (Change)
y = LTrim(TextBox1.Text) 'si legge il contenuto della textbox ad ogni digitazione
If X = 2 Then TextBox1 = y & "/" 'e si concatena testo e una barra quando si è scritto 2 caratteri
If X = 5 Then TextBox1 = y & "/" 'poi si concatena testo e seconda barra quando il testo è 5 caratteri
If X = 10 Then 'quando il testo sarà lungo 8 caratteri (op. mettere 10 se anno a quattro cifre)

[A1] = CDate(TextBox1) 'si copia il testo come data (CDate) in una cella

TextBox2.SetFocus
End If
End Sub

__________________________________________________ _______________

Private Sub TextBox2_Change()

X = Len(TextBox2) 'si misura la lunghezza del testo nella texbox ad ogni digitazione (Change)
y = LTrim(TextBox2.Text) 'si legge il contenuto della textbox ad ogni digitazione
If X = 2 Then TextBox2 = y & "/" 'e si concatena testo e una barra quando si è scritto 2 caratteri
If X = 5 Then TextBox2 = y & "/" 'poi si concatena testo e seconda barra quando il testo è 5 caratteri
If X = 10 Then 'quando il testo sarà lungo 8 caratteri (op. mettere 10 se anno a quattro cifre)

[B1] = CDate(TextBox2) 'si copia il testo come data (CDate) in una cella

'Unload Me
Range("C1").Select
End If

TextBox3.Text = [C1]
TextBox4.Text = [d1]
TextBox5.Text = [e1]
End Sub
__________________________________________________ _______________

Gabry
20-07-2006, 09.25.29
Avevo modificato l'eventoTextBox1_Change in questo modo:

Private Sub TextBox1_Change()

If Len(TextBox1) = 10 Then

s_Data$ = Format$(TextBox1, "00/00/0000")

If IsDate(s_Data$) = False Then
MsgBox "La data immessa non é esatta!"
Else
TextBox1 = vbNullString
Cells(1, 1).Value = s_Data$
End If
'End If


'X = Len(TextBox1)
'y = LTrim(TextBox1.Text)
'If X = 2 Then TextBox1 = y & "/"
'If X = 5 Then TextBox1 = y & "/"
'If X = 10 Then

[A1] = CDate(TextBox1) 'si copia il testo come data (CDate) in una cella

TextBox2.SetFocus
End If
End Sub

LoryOne
20-07-2006, 09.46.27
Ora ho capito tutto.
Non è sull'evento change che devi intervenire per la verifica della data ma sul keypress.
Mi è chiara anche un'altra cosa e cioè che tu vuoi che venga aggiunta e visualizzata la "/" quando digiti le prima 2 cifre per il giorno e le 2 cifre del mese.
Se prima però non immetti anche le 4 cifre (o 2 se preferisci) dell anno, non puoi verificare la congruità della data.
Infatti:
Per i bisestili febbraio ne ha 29 ma prima inserisci i giorni
Aprile,Giugno,Settembre e Novembre ne hanno 30 ma tutti gli altri 31. non puoi verificare che il giorno sia corretto se prima non immetti il mese che a sua volta dipende dall' anno.
Ragiona sempre sul keypress e non sul change perchè è meno facile gestirlo.
Ad ogni modo, ti suggerisco di evitare di utilizzare una semplice textbox e di passare ad maskeditbox che sicuramente ti faciliterà il compito per quanto riguarda la formattazione della data.

Gabry
20-07-2006, 10.39.10
...Ad ogni modo, ti suggerisco di evitare di utilizzare una semplice textbox e di passare ad maskeditbox che sicuramente ti faciliterà il compito per quanto riguarda la formattazione della data.


Ti ringrazio per le spiegazioni, ora cercherò di applicarle... ma mi dici cosa é una maskeditbox, dove la prendo?

LoryOne
20-07-2006, 19.13.08
E' tra i controlli aggiuntivi.