countdown



  • countdown
    di nichicanta data: 11/06/2013 15:53:42

    Amici del forum, ho creato una userform con tre textbox e un pulsante di comando dove inserire ore, minuti e secondi e poi lanciare la macro che fa il conto alla rovescia, ma il codice che ho trovato in internet si blocca alla riga:secondi =
    CDbl(UserForm1.TextBox1.Text) * 3600 + CDbl(UserForm1.TextBox2.Text) * 60 + CDbl(UserForm1.TextBox3.Text) e l'errore mi dice: tipo non corrispondente e nobn mi fa andare avanti.
    Chiedo a tutti voi un aiuto per capire dove sbaglio, magari dandomi opportuna spiegazione e consiglio.
    Vi saluto
     
    Sub Prova1()
    Dim secondi, secondi1, TOT As Double
    Dim x, y, z As TextBox
    secondi = 0
    secondi1 = 0
    UserForm1.Show vbModeless
    secondi = CDbl(UserForm1.TextBox1.Text) * 3600 + CDbl(UserForm1.TextBox2.Text) * 60 + CDbl(UserForm1.TextBox3.Text)
    secondi1 = CDbl(Hour(Now)) * 3600 + CDbl(Minute(Now)) * 60 + CDbl(Second(Now))
    If secondi < secondi1 Then
    TOT = 86399 - secondi1 + secondi
    Else
    TOT = secondi - secondi1
    End If
    h = TOT  3600
    m = CInt((TOT Mod 3600)  60)
    s = CInt((TOT Mod 3600) Mod 60)
    
    'al posto delle tre istruzioni precedenti si poteva usare l'istruzione Format....
    If h = 0 And m = 0 And s = 0 Then
    MsgBox "PROVA, SE SEI GIUNTO FINO QUI IL CODICE FA TUTTO QUELLO CHEW HAI IMPOSTATO)"
    
    End If
    End Sub
    
     



  • di Mister_x data: 11/06/2013 18:27:52

    ciao

    ho controllato di sfuggita la tua sub() ma a parte il meccanismo di calcolo non vedo la parte che fa il loop per il tempo
    comunque ti passo due sub() da mettere in un modulo e un file come esempio di come viene impostato tale controllo
    si intende che questa e' una spece di base per la partenza

    ciao da Mister_x
     
    Sub Avvia()
        Foglio1.Select
        [M1] = [B2] / 86400 + Time
        Conto_alla_Rovescia
    End Sub
    
    Sub Conto_alla_Rovescia()
        If ThisWorkbook.Worksheets("Foglio1").Range("M1").Value <= Time Then
            MsgBox "Tempo SCADUTO   ! ! !"
            Exit Sub
        End If
        ThisWorkbook.Worksheets("Foglio1").Range("A1").Value = Format(ThisWorkbook.Worksheets("Foglio1").Range("M1").Value - Time, "hh:mm:ss")
        DoEvents
        Application.OnTime Now + TimeSerial(0, 0, 1), "Conto_alla_Rovescia"
    End Sub
    
    



  • di Vecchio Frac data: 11/06/2013 20:10:49

    cit. " si blocca alla riga:secondi = CDbl(UserForm1.TextBox1.Text) * 3600 + CDbl(UserForm1.TextBox2.Text) * 60 + CDbl(UserForm1.TextBox3.Text) e l'errore mi dice: tipo non corrispondente"
    ---> In effetti è normale, all'avvio dell'userform le due textbox sono vuote e quindi la conversione in Double mediante CDbl fallisce.
    Come dice mister_x, il codice che hai mostrato non può fare quello che vorresti perchè manca un ciclo all'interno del quale deve essere confrontata di continuo l'ora corrente con quella impostata nelle tre textbox; quando l'ora corrente raggiunge quella impostata allora il ciclo può avere termine. In pratica il ciclo Do...Loop va impostato dopo aver mostrato l'userform e termina dopo la verifica su h, m, s (il codice è comunque un pochino arzigogolato).





  • di nichicanta (utente non iscritto) data: 12/06/2013 11:55:47

    Grazie ancora, non avevo dubbi e mi complimento per la vostar disponibilità e competenza.
    Ho notato in altre discussioni come altri come voi risolvono quesiti quasi impossibili ( tipo quello sulle probabilità ecc).
    Cmq cercherò di utilizzare il codice da Voi postato e lo farò comparire in un label sulla maschera iniziale che ho creato.
    Un saluto a tutti Voi che mi aiutate nessuno escluso.
    Sono contento di aver trovato un forum di persone competenti e disponibili.



  • di Vecchio Frac data: 12/06/2013 12:46:20

    Ecco, queste considerazioni per me sono gratificanti ;)
    Grazie





  • di nichicanta (utente non iscritto) data: 12/06/2013 15:41:34

    Carrissimi amici, ho bisogno di capire come mai il time nelal label pur facendo riferimento alla cella del foglio non visualizza l'orario che scorre?.
    Ho adattato il vostro codice e diciamo che ci siamo quasi, vi chiedo inoltre di indicarmi come faccio per stopparlo nel caso volessi fermarlo e riprenderlo successivamente magari modificando la captio del pulsante di cpomando in base allo stato e cioe: Avvia, sto, riprendi.
    P.S. Vorrei un aiuto e proseguire in questo modo.
    Vi ringrazio anticipatamente
     
    Sub Avvia()
        response = InputBox("Inserisci il tempo per la prova in secondi." & chr13 & chr13 & chr13 & " Ad esempio se vuoi inserire come tempo 1 ora " _
        & chr13 & " devi inserire 3600")
        Foglio1.Select
        [b2] = response
        [m1] = [b2] / 86400 + Time
        UserForm1.Label1 = "Il tempo a tua disposizione è:" & ThisWorkbook.Worksheets("Foglio1").Range("A1").Value
    
        'Application.OnTime Now + TimeSerial(0, 0, 1), "Conto_alla_Rovescia"
        Conto_alla_Rovescia
        
    End Sub
    
    Sub Conto_alla_Rovescia()
        If ThisWorkbook.Worksheets("Foglio1").Range("M1").Value <= Time Then
            MsgBox "Tempo SCADUTO   ! ! !"
            Exit Sub
        End If
        ThisWorkbook.Worksheets("Foglio1").Range("A1").Value = Format(ThisWorkbook.Worksheets("Foglio1").Range("M1").Value - Time, "hh:mm:ss")
        DoEvents
        Application.OnTime Now + TimeSerial(0, 0, 1), "Conto_alla_Rovescia"
    End Sub
    



  • di Vecchio Frac data: 12/06/2013 18:47:42

    Per inciso, non "chr13" ma chr(13) (oppure vbCrLf).
    Ti saresti accorto dell'errore se avessi premesso, come dico sempre, Option Explicit :)





  • di Vecchio Frac data: 12/06/2013 18:57:18

    Il codice funziona perfettamente, mostrando il countdown sul foglio (cella A1).
    Il problema è che non mostri l'userform quindi non hai questa informazione aggiuntiva.
    Correggi come di seguito.
    Anche se, in verità, io sceglierei: o mostrare il countdown nel foglio, o nell'userform; scegli una modalità di interazione con l'utente e porta avanti quella. Inutile farne due.
     
    Option Explicit
    
    Sub Avvia()
    Dim response
        response = InputBox("Inserisci il tempo per la prova in secondi." & vbCrLf & " Ad esempio se vuoi inserire come tempo 1 ora " _
        & " devi inserire 3600")
        Foglio1.Select
        [b2] = response
        [M1] = [b2] / 86400 + Time
        
        UserForm1.Label1 = "Il tempo a tua disposizione è: " & [A1]
        UserForm1.Show vbModeless
    
        Call Conto_alla_Rovescia
        
    End Sub
    
    Sub Conto_alla_Rovescia()
        If [M1] <= Time Then
            MsgBox "Tempo SCADUTO   ! ! !"
            Unload UserForm1
            Exit Sub
        End If
        [A1] = Format([M1] - Time, "hh:mm:ss")
        
        'aggiorna l'userform
        UserForm1.Label1 = "Il tempo a tua disposizione è: " & Format([M1] - Time, "hh:mm:ss")
        
        DoEvents
        Application.OnTime Now + TimeSerial(0, 0, 1), "Conto_alla_Rovescia"
    End Sub






  • di nichicanta (utente non iscritto) data: 13/06/2013 16:32:21

    Grazia ancora V.F. comunque io volevo (ho dovuto appoggiarmi al foglio di Excel perchè non sapevo farlo direttamente in userform, desiderando di ottenere lo stesso risultato) ottenere il risultato del conto alla rovescia sulla userform, visualizzandolo nella label e a fianco a questa, creare un pulsante di comando che successivamente alla partenza del countdown mi potesse permettere di stoppare il tempo e poi riprenderlo.
    Riesci per favore a buttare giu' il codice che mi faccia questo sulla userfom.
    P.S. riguardo a option explicit, devi sapere che lo mette all'inizio di ogni codice da me creato e da voi suggerito, in questo caso mi ero appoggiato ad un file di esempio e ho dimenticato di mettere in atto il tuo validissimo consiglio.



  • di nichicanta (utente non iscritto) data: 15/06/2013 18:22:24

    Carissimi Amici del forum, per chi avesse la mia necessità, allego il codice che fa questo.
    Rinnovo il mio grazie a tutti (esperti e non ) che mi aiutano nel risolvere le mie problematiche.
    A presto.
     
    Sub Mischia() 'mischia tutte le righe del foglio
    'richiede come parametro la stringa del nome del foglio
    Dim i As Long, riga As Long, ultima As Long, rr As Long, temp As Long, Sh As Worksheet
        Set Sh = ThisWorkbook.Sheets(1)
        With Sh
            ultima = Range("A1").End(xlDown).Row 'Ultima riga occupata del foglio
            temp = ultima + 1 'riga di "appoggio" che uso per mischiare
            For riga = 2 To ultima - 1 'dalla prima alla penultima riga
                Do
                    rr = Int((ultima * Rnd) + 1) 'scelgo una riga a caso
                Loop Until rr > riga 'se è una riga gia mischiata ripeto il passo precedente
                Cells(riga, 1).EntireRow.Copy Destination:=Cells(temp, 1) 'copio la riga da mischiare nella riga di appoggio
                Cells(rr, 1).EntireRow.Copy Destination:=Cells(riga, 1) 'copio la riga scelta a caso sulla riga da mischiare
                Cells(temp, 1).EntireRow.Copy Destination:=Cells(rr, 1) 'copio la riga di appoggio sulla riga scelta a caso
            Next riga 'passa alla successiva riga da mischiare
            Cells(temp, 1).EntireRow.ClearContents 'cancello la riga di appoggio
        End With 'Sh
        Set Sh = Nothing
    End Sub



  • di nichicanta (utente non iscritto) data: 15/06/2013 18:27:32

    La gioia di aver risolto il mio problema e la fretta mi hanno fatto dare la risposta sbagliata, Amici mi riferivo ad un'altra discussione dove chiedevo di creare una funzione che mi mischiasse i dati di un quiz.
    Per cortesia, considerate questo codice utile per il random dei dati e non per quanto richiesto in questa discussione che verte su altro argomento.
    Saluti e scusatemi ancora.



  • di Vecchio Frac data: 15/06/2013 20:11:22

    cit. " Riesci per favore a buttare giu' il codice che mi faccia questo sulla userfom. "
    ---> Mi sembra che il pezzo di codice che ho già inviato faccia proprio questo, mostrare il timer nell'userform (il punto che ti mancava era solo mostrare l'userform con .Show)
     
        'aggiorna l'userform
        UserForm1.Label1 = "Il tempo a tua disposizione è: " & Format([M1] - Time, "hh:mm:ss")
     






  • di nichicanta (utente non iscritto) data: 16/06/2013 18:50:23

    Ecco caro V.F. nel file che ti allego aiutami a creare nei option button che hanno la caption Arresta e riprendi a creare il codice che mi faccia arrestare il tempo impostato con il codice che ti ho allegato e a a farlo ripartire attivando lìaltro option button. Ti saluto e ti ringrazio.
     
    Sub Avvia()
    Dim response
        response = InputBox("Inserisci il tempo per la prova in secondi." & vbCrLf & "Ad esempio se vuoi inserire come tempo 1 ora " _
        & " devi inserire 3600.")
            If response = "" Then
            UserForm1.OptionButton1.Visible = False
            UserForm1.OptionButton2.Visible = False
            UserForm1.OptionButton3.Visible = True
            UserForm1.OptionButton3 = False
            UserForm1.Label9.Visible = False
            Exit Sub
            End If
        Worksheets("Foglio3").Select
        [b2] = response
        [M1] = [b2] / 86400 + Time
        UserForm1.Label9 = "Il tempo a tua disposizione è: " & [A1]
        
        'UserForm1.Show vbModeless
    
        Call Conto_alla_Rovescia
      
    End Sub
    Sub Conto_alla_Rovescia()
         'bln = True
        
            If [M1] <= Time Then
                MsgBox "Tempo SCADUTO   ! ! !"
                Unload UserForm1
                Exit Sub
            End If
        [A1] = Format([M1] - Time, "hh:mm:ss")
        
        'aggiorna l'userform
        UserForm1.Label9 = "Il tempo a tua disposizione è: " & Format([M1] - Time, "hh:mm:ss")
        DoEvents
        Application.OnTime Now + TimeSerial(0, 0, 1), "Conto_alla_Rovescia"
       End Sub