Condividi tramite

Chiusura userform

Anonimo
2010-03-21T17:41:28+00:00

Su una UserForm ho il seguente codice:

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Not IsDate(TextBox2) Then

  Cancel = True

  Me.TextBox2.SelStart = 0

  Me.TextBox2.SelLength = Len(Me.TextBox2.Text)

  MsgBox "Attenzione! Inserire una data in formato 10/01/2010.", vbInformation

  TextBox2 = ""

End If

End Sub

Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Not IsDate(TextBox6) Then

  Cancel = True

  Me.TextBox6.SelStart = 0

  Me.TextBox6.SelLength = Len(Me.TextBox6.Text)

  MsgBox "Attenzione! Inserire una data in formato 10/01/2010.", vbInformation

  TextBox6 = ""

End If

End Sub

Private Sub CommandButton3_Click()

Unload UserForm1

End Sub

In pratica devo controllare che nella textbox2 e textbox6 sia inserita correttamente una data.

Il problema sorge se decido di non inserire nulla e voglio chiudere la form con il commandbutton3 mi si ripresenta sempre il msgbox e non chiude la form.

Come posso correggere?

Ringrazio e saluto tutti.

Ciao

Antonio

Microsoft 365 e Office | Editore | Per la casa

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-03-23T14:44:21+00:00

Ciao Mauro e grazie dei chiarimenti, comunque ho visto che gestire su più textbox-data diventa caotico, almeno per me, come al solito le date in excel, sia se si tratti di formule o VB, mi mandano al manicomio :-(( ;

Un'idea, poi decidi tu. Ti ho comunque risposto nell'altro thread per ciò che riguarda le ComboBox.

Nella UserForm ho 10 TextBox e voglio controllare la data nei termini richiesti solo nelle TextBox2, 5, 7.

Creo una Collection delle TextBox2, 5, 7 e valuterò solo quelle. Se le TextBox hanno una data o sono vuote, chiudo la UserForm, altrimenti mi posiziono sulla TextBox con errore:

Private Sub CommandButton1_Click()

On Error GoTo RigaErrore

    'dichiaro le variabili

    Dim col As Collection

    Set col = New Collection

    Dim bln As Boolean

    Dim v As Variant

    Dim s() As String

    'creo una collection con le TextBox

    'che devo controllare(qui TextBox2,5,7)

    With Me

        col.Add .TextBox2, "TextBox2"

        col.Add .TextBox5, "TextBox5"

        col.Add .TextBox7, "TextBox7"

    End With

    'controllo il contenuto delle TextBox

    For Each v In col

        'se la cella è vuota non ha

        'importanza quindi non scateno

        'errori

        If v.Text <> "" Then

            '*splitto* il contenuto

            s = Split(v.Text, "/")

            'controllo che ci sia un mese valido

            '(ma potrei controllare anche giorni,

            'mesi e anni)

            If s(1) <= 12 Then

                'nell'esempio se la data è valida

                'la scrivo nella cella attiva

                ActiveCell.Value = CDate(v.Text)

            Else

                'imposto a True la variabile

                bln = True

                'se il valore non è valido

                'una MsgBox

                MsgBox "Valore non valido."

                'seleziono il contenuto della cella

                v.SelStart = 0

                v.SelLength = Len(v.Text)

                v.SetFocus

            End If

        End If

    Next

'riga sempre eseguita

RigaChiusura:

    'Set a Nothing delle variabili oggetto

    Set col = Nothing

    'se bln ha valore False(non ci sono

    'errori nelle TextBox), chiudi

    'la UserForm

    If bln = False Then Unload Me

    Exit Sub

'in caso d'errore

RigaErrore:

    'imposto a True la variabile

    bln = True

    'MsgBox

    MsgBox "Valore non valido."

    'seleziono il contenuto della cella

    With v

        .SelStart = 0

        .SelLength = Len(.Text)

        .SetFocus

    End With

    Resume RigaChiusura

End Sub

Si potrebbe anche indicizzare il tutto evitando la Collection, ma quest'ultima ti lascia libertà sui nomi da assegnare alle TextBox. Immagino sia intuitivo come modificare i nomi delle TextBox controllate e puoi aggiungere quelle che vuoi.


Mauro Gamberini - Microsoft© MVP(Excel) - http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-03-22T17:23:59+00:00

    Eccomi Mauro, ho fatto un pò di prove ed ho adattato così:

    Private Sub CommandButton1_Click()

    If Not IsDate(TextBox2) Then

      Cancel = True

      Me.TextBox2.SelStart = 0

      Me.TextBox2.SelLength = Len(Me.TextBox2.Text)

      MsgBox "Attenzione! Inserire una data in formato 10/01/2010.", vbInformation

      TextBox2 = ""

      Exit Sub

    End If

    If Not IsDate(TextBox6) Then

      Cancel = True

      Me.TextBox6.SelStart = 0

      Me.TextBox6.SelLength = Len(Me.TextBox6.Text)

      MsgBox "Attenzione! Inserire una data in formato 10/01/2010.", vbInformation

      TextBox6 = ""

      Exit Sub

    End If

    '< a seguire codice di archiviazione nel foglio se non si verificano errori

    End Sub

    poi nel pulsante di chiusura ho messo il codice che mi hai passato che mi permette di chiudere nel caso non inserisco niente.

    Rimangono due problemi che mi si sono presentati, spero risolvibili, il primo nel caso si verifichi errore di data sbagliata si blocca l'inserimento ma poi non mi seleziona la text interessata, come vorrei.

    Per il secondo più che altro è un'integrazione che vorrei fare al tuo codice, in pratica ho visto che se i dati non sono completi (cioè entrambe le textbox delle date non sono riempite e decido di abbandonare) non chiude, quindi voglio aggiungere in If con messaggio di avviso se continuare a inserire oppure uscire, quindi se decido di uscire faccio in modo di cancellare i dati nelle text e poi esco, altrimenti torno alla user; questo comunque credo di riuscirlo a fare (piano piano, con calma :-)).

    Per ora ti ringrazio e un saluto.

    Ciao

    Antonio

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-03-22T14:36:11+00:00

    Fai il controllo al momento di chiudere la UserForm, ad esempio sul click di un CommandButton. Qui controllo TextBox1 e TextBox2. Se sono vuoti si chiude la UserForm, altrimenti se c'è un valore, viene controllato sia una data:

    Private Sub CommandButton1_Click()

        With Me

            If .TextBox1.Text <> "" Then

                If Not IsDate(.TextBox1.Text) Then

                    With .TextBox1

                        MsgBox .Name & " non coniene una data."

                        .SelStart = 0

                        .SelLength = Len(.Text)

                        .SetFocus

                    End With

                End If

            ElseIf .TextBox2.Text <> "" Then

                If Not IsDate(.TextBox2.Text) Then

                    With .TextBox2

                        MsgBox .Name & " non coniene una data."

                        .SelStart = 0

                        .SelLength = Len(.Text)

                        .SetFocus

                    End With

                End If

            Else

                Unload Me

            End If

        End With

    End Sub

    Occhio a Isdate. Potrebbe non restituire ciò che vuoi.


    Mauro Gamberini - Microsoft© MVP(Excel) - http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-03-22T14:02:13+00:00

    Ciao Mauro, scusa ti rispondo da altro PC, quindi non badare al nome; si in effetti ho provato anche con

    Private Sub Textbox2_AfterUpdate()

    If Not IsDate(TextBox2) Then

      MsgBox "Attenzione inserire una data in formato 10/01/2010", , "Controllo dati"

      TextBox2 = ""

      TextBox2.SetFocus

    End If

    End Sub

    ma in questo caso ho problemi a riselezionare la textbox2 e poi quando esco (se decido di abbandonare) mi si ripresenta il msgbox; insomma non riesco a trovare un compromesso accettabile. In pratica io una volta aperta la userform posso o abbandonare l'applicazione senza scrivere nulla (quindi in questo caso non mi deve restituire nessun messaggio di errore) o inserire una data, prima alla textbox2 e poi, dopo compilazione altre text inserire altra data alla textbox6, infine premo un pulsante per memorizzare tutto sul foglio; se una delle due date non viene inserita in modo corretto avere msg di avviso e il cursore mi si dovrebbe riposizionare sulla text interessata per reinserimento corretto. Spero di essermi spiegato, bene. Grazie della risposta e un saluto.

    Ciao

    Antonio

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-03-22T09:21:23+00:00

    Hai provato ad utilizzare l'evento: AfterUpdate della TextBox?


    Mauro Gamberini - Microsoft© MVP(Excel) - http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento