controllo date tra textbox
Hai un problema con Excel? 
controllo date tra textbox
di mcutolo data: 31/07/2017 09:49:14
Buongiorno
ho formattato due textbox come data. Adesso ho la necessità di confrontare le due date , la data di notifica (TextBox2) non può essere superiore alla data di scadenza (TextBox1)
Mi aiutate col codice
GHrazie
di Gianfranco data: 31/07/2017 10:16:41
ciao
non sono esperto in vba
ma penso questo vada bene
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox2.Value = Format(TextBox2.Text, "dd/mm/yyyy")
If TextBox2.Value > TextBox1.Value Then
MsgBox "errore data"
TextBox2.Value = ""
End If
End Sub
la prossima volta se alleghi un mini file
ci aiuti
di mcutolo data: 31/07/2017 10:50:45
Allego il file per maggiore chiarezza , non guardate la forma è da migliorare , per il momento mi serve che sia funzionale. Come dicevo la data di notifica non può essere superiore alla data di scadenza.
Volevo anche chiedervi perchè premendo il tasto "TAB" non segue i campi della userform così come sono in seguenza
grazie
di Vecchio Frac data: 31/07/2017 11:02:34
cit. "perchè premendo il tasto "TAB" non segue i campi della userform così come sono in seguenza"
---> Man mano che aggiungi o togli controlli a un form questi assumono un valore di tabulazione sequenziale che però non è quello dell'ordine di visualizzazione (quando per esempio sposti controlli o ne copi incolli altri).
La sequenza devi impostarla tu indicando il corretto ordine della proprietà TabIndex.
Per fare questo:
- apri l'userform in modalità design
- premi F4 per attivare la finestra delle proprietà
- clicca sui controlli di cui vuoi impostare il TabIndex (indice di tabulazione), per esempio la textbox "Data di scadenza" (TextBox7 nel tuo userform)
- cerca nel riquadro delle proprietà la proprietà TabIndex
- imposta il valore zero per il primo controllo
- clicca sugli altri controlli nella sequenza desiderata e inserisci per le rispettive proprietà TabIndex il numero successivo della sequenza (1, 2, 3, ...)
di mcutolo data: 31/07/2017 11:18:53
Grazie Vecchio Frac , gentilissimo , ho risolto col TabIndex
non riesco però a confrontare le textbox con le date
di Vecchio Frac data: 31/07/2017 11:22:18
cit. "la data di notifica non può essere superiore alla data di scadenza. "
---> Un esempio di come modificare il tuo codice. Bisogna poi vedere se tu vuoi che l'avviso sia in diretta, come suggerisce Gianfranco, cioè subito dopo l'aggiornamento del campo, o se ti basta e avanza che il controllo sia fatto al momento della registrazione.
Private Sub CommandButton1_Click()
'pulsante REGISTRA
Dim Uriga As Long
If TextBox7 = "" Then 'controlla che il textbox1 non sia vuoto, se è vuoto allora
MsgBox "Inserire data scadenza" 'avvisa con un messaggio
TextBox7.SetFocus 'posiziona il focus sul textbox7
Exit Sub 'ed esce dalla routine senza completare il resto delle istruz.
End If
'la data di notifica non può essere superiore alla data di scadenza: è vietato TextBox4 > TextBox7
If CDate(TextBox4) > CDate(TextBox7) Then
MsgBox "La data di notifica non può essere superiore alla data di scadenza" 'avvisa con un messaggio
TextBox4.SetFocus 'posiziona il focus sulla data di notifica
Exit Sub 'ed esce dalla routine senza completare il resto delle istruz.
End If
Uriga = Sheets("Foglio1").Range("A" & Rows.Count).End(xlUp).Row + 1 'avrai la prima cella vuota
With Sheets("Foglio1")
.Cells(Uriga, 1) = TextBox7.Text
.Cells(Uriga, 2) = ComboBox1.Text
.Cells(Uriga, 3) = ComboBox2.Text
.Cells(Uriga, 4) = TextBox1.Text
.Cells(Uriga, 5) = TextBox4.Text
.Cells(Uriga, 6) = TextBox8.Text
.Cells(Uriga, 7) = ComboBox3.Text
.Cells(Uriga, 8) = ComboBox4.Text
.Cells(Uriga, 9) = TextBox9.Text
.Cells(Uriga, 10) = TextBox10.Text
.Cells(Uriga, 11) = TextBox11.Text
.Cells(Uriga, 12) = TextBox12.Text
End With
End Sub
|
di mcutolo data: 31/07/2017 16:14:24
Ok grazie ad entrambi ho risolto in parte le mie esigenze, allego il file corretto perchè volevo farvi notare che nella TextBox12 (Data consegna) non riconosce l'errore nell'inserimento della data. Cioè la data inserita nella TextBox12 dovrebbe essere inferiore alla data della TextBox7 e maggiore della data della TextBox4
di Vecchio Frac data: 31/07/2017 16:39:38
Ma è perchè nel file che hai allegato ("...corretto.xlsm") non gestisci la condizione nell'evento BeforeUpdate della textbox12 (data di consegna).
Private Sub TextBox12_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox12.Value = Format(TextBox12.Text, "dd/mm/yyyy")
If (CDate(TextBox12) < CDate(TextBox7)) And (CDate(TextBox12) > CDate(TextBox4)) Then
MsgBox "Attenzione data immessa non valida"
TextBox12.Value = ""
Cancel = True
End If
End Sub |
di mcutolo data: 31/07/2017 17:16:46
Comunque il controllo lo fa sul giorno , infatti come si vede dalla foto allegata non considera errate le date inserite
di Vecchio Frac data: 31/07/2017 19:45:19
CDate servirebbe proprio a convertire il testo in data e quindi ad effettuare un controlla tra date.
Magari se ho un attimo stasera ci guardo meglio :)
di Vecchio Frac data: 01/08/2017 09:53:38
Fai una verifica separata sulle condizioni.
Private Sub TextBox12_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'errore se la data inserita nella TextBox12 (consegna) è maggiore della data
'della TextBox7 (scadenza) e minore della data della TextBox4 (notifica)
Dim b As Boolean, ctl As Control
If TextBox12 = "" Then Exit Sub
b = True
TextBox12.Value = CDate(Format(TextBox12.Text, "dd/mm/yyyy"))
If TextBox7 <> "" Then
If CDate(TextBox12) > CDate(TextBox7) Then b = False: Set ctl = TextBox7
End If
If TextBox4 <> "" Then
If CDate(TextBox12) < CDate(TextBox4) Then b = False: Set ctl = TextBox4
End If
If b = False Then
MsgBox "Attenzione data immessa non valida"
TextBox12.Value = ""
ctl.SelStart = 0
ctl.SelLength = Len(ctl)
ctl.SetFocus
Cancel = True
End If
End Sub
|
di mcutolo data: 01/08/2017 18:01:07
Grazie ancora Vecchio Frac, però come puoi notare dalle due fotto allegate (Dati e Foglio1) nelle TextBox4 (Data Notifica) e TextBox12 (Data consegna) inverte il giorno con il mese
di Vecchio Frac data: 01/08/2017 21:51:51
Che palle, è il solito arcinoto e arcirompi problema delle date ^_^
Correggi il codice del command button di registrazione come segue, per forzare l'inserimento di un valore in formato data.
Private Sub CommandButton1_Click() 'pulsante REGISTRA
Dim Uriga As Long
If TextBox7 = "" Then 'controlla che il textbox1 non sia vuoto, se è vuoto allora
MsgBox "Inserire data di scadenza" 'avvisa con un messaggio
TextBox7.SetFocus 'posiziona il focus sul textbox7
Exit Sub 'ed esce dalla routine senza completare il resto delle istruz.
End If
Uriga = Sheets("Foglio1").Range("A" & Rows.Count).End(xlUp).Row + 1 'avrai la prima cella vuota
With Sheets("Foglio1")
.Cells(Uriga, 1) = CDate(TextBox7.Text)
.Cells(Uriga, 2) = ComboBox1.Text
.Cells(Uriga, 3) = ComboBox2.Text
.Cells(Uriga, 4) = TextBox1.Text
.Cells(Uriga, 5) = CDate(TextBox4.Text)
.Cells(Uriga, 6) = TextBox8.Text
.Cells(Uriga, 7) = ComboBox3.Text
.Cells(Uriga, 8) = ComboBox4.Text
.Cells(Uriga, 9) = TextBox9.Text
.Cells(Uriga, 10) = TextBox10.Text
.Cells(Uriga, 11) = TextBox11.Text
.Cells(Uriga, 12) = CDate(TextBox12.Text)
End With
End Sub |
di mcutolo data: 03/08/2017 12:49:54
Grazie!!!
Ho un altro dubbio. Nella TextBox13 ho la necessità di fare un doppio controllo, cioè che si inseriscano solo numeri e che la lunghezza del nr sia obbligatoriamente di 11 cifre.
Separatamente riuscirei a gestirle, non so unire i 2 eventi KeyPress e Exit
Private Sub TextBox13_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox13) <> 11 Then
MsgBox "Attenzione occorre inserire 11 cifre"
TextBox13.Text = ""
Cancel = True
End If
End Sub
Private Sub Text13_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
Beep
End If
End Sub |
di Vecchio Frac data: 03/08/2017 21:57:56
Perchè li dovresti "unire"? Non funzionano bene così? Mentre digiti vengono accettati solo numeri (forse così non viene accettato nemmeno il Canc, il Backspace e l'invio, le frecce destra e sinistra, Home, End... pazienza). Quando esci dal campo si fa il controllo sulla lunghezza (e mi azzeri tutto quanto era stato digitato... aaaargh! se fossi un tuo utente te ne direi dietro quattro ^_^)
Vuoi Approfondire?