controllo date tra textbox



  • 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 ^_^)