contatempo programmabile progressivo



  • contatempo programmabile progressivo
    di umafabio data: 11/01/2013 11:41:44

    Ciao a tutti coloro che potranno aiutarmi io non sono esperto di macro , ma mi serve inserire in a1 un contatore minuti secondi , che quando raggiunge un tempo che inserisco in a2 per esempio mi faccia comparire in c1 una numerazione progressiva che parte da 1.
    per esempio in inserisco la cadenza in a2 es: 12,7 sec quindi in a1 tramite un pulsante o un tasto il crono parte.
    Al raggiungimento del tempo fissato in a2 in c1 mi compare 1, alraggiungimento del doppio mi compare 2 ecc.
    Poi ovviamente mi serve il tasto reset.

    qualcuno ha capito ?

    GRAZIE in tutti i casi

    umafabio
    Fresh Boarder
    Messaggi: 1
    graphgraph
    Utente attualmente Online Clicca qui per vedere il profilo di questo Utente



  • di Vecchio Frac data: 11/01/2013 14:27:20

    Una cosa simile era già passata di qui poco tempo fa.
    Riprendo quel codice e lo adatto per questa discussione.
    Allego un piccolo file di esempio oltre a postare il codice pro futuro.
    StartTimer è associata a Ctrl-Maiusc-Q, StopTimer a Ctrl-Maiusc-Z.
    Imposta un valore di attesa in A2 e buon divertimento :)

    Sempre se nell'altro forum non ti hanno dato una soluzione più soddisfacente ;)
     
    'in un modulo
    Option Explicit
    
    Public RunWhen As Double
    Public cRunIntervalSeconds As Integer    'secondi
    Public Const cRunWhat = "TheSub"
    
    Sub StartTimer()
        cRunIntervalSeconds = [A2]
        If cRunIntervalSeconds = 0 Then MsgBox "Inserire in A2 un numero diverso da zero.": Exit Sub
        If Val([C4]) = 0 Then [C2] = "Running."
        RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
        Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True
    End Sub
    
    Sub TheSub()
        [C4] = [C4] + 1
        StartTimer  ' Reschedule the procedure
    End Sub
    
    Sub StopTimer()
        On Error Resume Next
        Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=False
        [C4].CurrentRegion.ClearContents
        [C2] = "Stopped."
    End Sub






  • di umafabio data: 11/01/2013 14:48:23

    E' un aiuto importantissimo, ed è soprattutto esattamente quello che ho chiesto.

    solo un paio di precisazioni che mi aiuterebbero:

    1 : mi servirebbe vedere il counter dei secondi e dei minuti.
    2 : mi servirebbe avere almeno 2 dispositivi nello sesso foglio, esempio uno in A B C come adesso ed uno in G H I completamente indipendente dal primo.
    3 : non so cosa ho sbagliato ma non riesco a fermarlo.

    Scusa se ho chiesto a due forum è solo che ho molta urgenza e non vedendo rispose ho chiesto e più fonti.
    Se non è deontologico ritiro l'altra richiesta poichè tu sei stato il più rapido.

    GRAZIEEEEEEEEEEEEEEEEEEEEEEEEE







  • di Vecchio Frac data: 11/01/2013 15:12:51

    Non ti preoccupare, nessuno si offende, anzi aumenti le chances di risposta. Mica abbiamo l'esclusiva e poi avevo messo l'occhiolino :)
    Comunque per vedere i secondi come minuti/secondi fai una formattazione di cella.
    Per avere timer multipli allora OnTime non va più bene e devi pensare a una soluzione con la chiamata ai timer API.
    Ora ho un appuntamento col Capo... se mi libero ci risentiamo.





  • di Vecchio Frac data: 11/01/2013 21:16:13

    Allego una seconda versione, che sfrutta le chiamate alle API SetTimer e KillTimer.
    Dai un'occhiata.





  • di isy (utente non iscritto) data: 12/01/2013 01:06:48

    Ciao

    Allego una terza versione causa grave instabilità del codice su Excel 2003.
    This page describes several methods of pausing code execution.
    cpearson.com/Excel/WaitFunctions.aspx

    Se si cambia scheda il timer opera correttamente
    Rimane la gestione del timer quando si modifica una cella che non aggiorna il tempo...
    Un saluto




     
    Option Explicit
        Public TimeOld As Variant
    '---Funzione per calcolare il tempo del ciclo
    Declare Function GetTickCount Lib "kernel32" () As Long
    
    Public Declare Function SetTimer Lib "user32" ( _
        ByVal HWnd As Long, _
        ByVal nIDEvent As Long, _
        ByVal uElapse As Long, _
        ByVal lpTimerFunc As Long) As Long
    
    Public Declare Function KillTimer Lib "user32" ( _
        ByVal HWnd As Long, _
        ByVal nIDEvent As Long) As Long
    
        Public TimerID_1 As Long
        Public TimerID_2 As Long
        
        Public TimerSeconds As Single
        
     
     Sub StartTimer_1()
        Dim speed As Variant
        speed = Foglio1.[A4] / 1000
        Foglio1.[C4] = "Running."
        If speed = 0 Then speed = 1
        TimerSeconds = 0.1  ' how often to "pop" the timer.
        TimerID_1 = SetTimer(0&, 0&, (TimerSeconds * 2500) + ((((TimerSeconds * 2500) / 10) * speed) / 10), AddressOf TimerProc_1) '0,5 secondi
     End Sub
    
     Sub EndTimer_1()
        On Error Resume Next
        KillTimer 0&, TimerID_1
        Foglio1.[C4] = "Stopped."
     End Sub
    
     Sub TimerProc_1(ByVal HWnd As Long, ByVal uMsg As Long, _
        ByVal nIDEvent As Long, ByVal dwTimer As Long)
        On Error Resume Next
        Foglio1.[C6] = Foglio1.[C6] + Foglio1.[A4] / 1000
        DoEvents
     End Sub
     '------------------------------------------------------------
     Sub StartTimer_2()
        Dim speed As Variant
        speed = Foglio1.[E4] / 1000
        Foglio1.[G4] = "Running."
        If speed = 0 Then speed = 1
        TimerSeconds = 0.1  ' how often to "pop" the timer.
        TimerID_2 = SetTimer(0&, 0&, (TimerSeconds * 2500) + ((((TimerSeconds * 2500) / 10) * speed) / 10), AddressOf TimerProc_2) '0,5 secondi
     End Sub
    
     Sub EndTimer_2()
        On Error Resume Next
        KillTimer 0&, TimerID_2
        Foglio1.[G4] = "Stopped."
     End Sub
    
     Sub TimerProc_2(ByVal HWnd As Long, ByVal uMsg As Long, _
        ByVal nIDEvent As Long, ByVal dwTimer As Long)
        On Error Resume Next
        Foglio1.[G6] = Foglio1.[G6] + Foglio1.[E4] / 1000
        DoEvents
     End Sub



  • di isy (utente non iscritto) data: 12/01/2013 01:31:12

    Ancora:
    Nota: è necessario aggiungere un ciclo sul pulsante Avvia per una singola esecuzione del codice prima di aver premuto Ferma.
    Altrimenti il pulsante Ferma non potrà interrompere i precedenti timer in esecuzione.



  • di Vecchio Frac data: 12/01/2013 09:10:46

    Grazie isy... avevo avuto anch'io qualche problema ma lo imputavo ai tanti processi aperti sul mio pc, in primis utorrent :)





  • di umafabio (utente non iscritto) data: 14/01/2013 11:09:25

    Innanzi tutto grazie dell'impegno, e secondariamente scusate solo adesso leggo le risposte che mi avete inviato.

    Allora, col primo file creavo la macro , la eseguivo e al netto delle precisazioi sopra il sistema anche se singolo il contatempo andava.
    Adesso è solo per mia ignoranza non riesco, creo la macro come prima, ma purtroppo mi appaiono molti errori di sintassi.
    Sono io sicuramente che non capisco, ma così non riesco, potete darmi qualche altra dritta?.

    Chiedo scusa.



  • di Vecchio Frac data: 14/01/2013 13:01:21

    Metti tutto il codice in un modulo.
    Hai scaricato (e provato) il file di isy? (version-2)
    A me funziona bene senza mandare in crash Excel.





  • di umafabio (utente non iscritto) data: 14/01/2013 14:46:31

    Si ho provato, ma mentre la tua funzionava, in quella di isy non so dove e come impostare i parametri e quando la eseguo mi continua a dare problemi, potresti se e quando hai tempo indicarmi passo passo come parti?

    Grazie