Condividi:        

Realizzare un cronometro in VBA

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Realizzare un cronometro in VBA

Postdi Charly_new » 08/03/10 18:00

Buon giorno a tutti, il mio nome è charly e sono un nuovo iscritto.
Mi chiedevo come e se fosse possibile, con istruzioni in VBA, realizzare un cronometro con risoluzioni come da immagine da visualizzare o in una texbox oppure in una cella del foglio di calcolo di Excel.
L'obiettivo è di campionare il tempo trascorso, "cliccando" un bottone, e memorizzarlo in una cella.
Una sorta di Start e Stop per intenderci.
Immagine
Spero che la mia richiesta d'aiuto risulti chiara.
Grazie anticipatamente per eventuali suggerimenti.
Ciao, charly.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Sponsor
 

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 09/03/10 01:43

Il vba ti mette a disposizione la funzione Timer, che restituisce il numero di secondi (con parecchi decimali) trascorsi dalla mezzanotte; partendo da questo valore puoi costruire in celle adiacenti formattate adeguatamente il contatore che ti serve.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 09/03/10 14:53

Grazie Anthony per l'interessamento.
So di essere sfacciato a chiederti di darmi un aiuto più concreto, perchè io non vado oltre alla visualizzazione di "hh:mm:ss".
Grazie, ciao!
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 09/03/10 21:40

Ho trovato in rete questo codice:

Codice: Seleziona tutto
Dim PauseTime, Start, Finish, TotalTime
Range("A1").Value = Now
Range("A1") = Format(Range("A1"), "h.m.ss")
10:
PauseTime = 1
Start = Timer

Do While Timer < Start + PauseTime
DoEvents

Loop
Finish = Timer
TotalTime = Finish - Start
Range("A1").Value = Now
Range("A1") = Format(Range("A1"), "h.m.ss")
GoTo 10

in sostanza mi fa vedere nella cella A1 l'orologio contare in tempo reale.
Sarebbe interessante vedere scorrere anche i decimi di secondo.
Sarebbe possibile adattare una modifica al codice, oppure c'è qualcosa di diverso per arrivare al mio scopo?
Grazie.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 09/03/10 22:32

Now non e' idonea per visualizzare con granularita' inferiore al secondo, per questo ti ho suggerito Timer.
Non hai detto molto su che cosa vorresti ottenere e con quali modalita', ti propongo quindi questo codice:
Codice: Seleziona tutto
Sub Crono()
[B1] = 1
Do While [B1] > 0
[A1] = Timer
DoEvents
Loop
End Sub

Sub Stoppa()
[B1].Clear
End Sub

Questa mette in A1 il "Timer"; poi in altra cella inserisci la formula =A1/3600/24 che formatterai come Categoria=Personalizzato e Tipo= hh:mm:ss,00
La macro usa anche la cella B1 come indicatore di start/stop.
Poi ti crei due Pulsanti (trovi la forma nella barra degli strumenti Moduli), uno lo chiami Start e gli associ la macro Crono, l' altro Stop e gli associ la macro Stoppa.

Poi vedi l' effetto che fa.
Se invece dell' orologio vuoi vedere la differenza rispetto al tempo di partenza, salva in una cella il timer iniziale e poi lavori sulla differenza tra quel valore e l' attuale.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 10/03/10 21:50

Immagine
Codice: Seleziona tutto
Sub via()
[B1] = 1
Do While [B1] > 0
[A1] = Timer
If [B2] = 1 Then GoTo 1
[A3] = [A2]
[B2] = 1
1: [A4] = [A2] - [A3]
DoEvents
Loop
End Sub
Codice: Seleziona tutto
Sub alt()
Dim iRow As Integer
iRow = 5
While Cells(iRow, 2).Value <> ""
iRow = iRow + 1
Wend
Cells(iRow, 2) = [A4]
[A4] = [A2] - [A3]
[B1] = 0
[B2] = 0
End Sub
Codice: Seleziona tutto
Sub reset()
[A4] = 0
End Sub
Grazie Anthony, il tuo codice funziona ed è perfetto per il cronometro che intendo realizzare.
Nel limite delle mie conoscenze ho provato inoltre a creare una sorta di storico ogni volta che fermo il cronometro incolonnando i valori nella colonna B.
Il codice che ho inserito a me sembra buono, tu che dici?
Però nonostante 'la funzionalità' non mi soddisfa quindi vorrei chiedere: con quali istruzioni posso associare nella colonna C il nome del concorrente che ha scaricato il tempo? (per esempio: 00.01,11 pippo)
Inoltre: come devo 'formattare' una Label per riuscire a visualizzare il valore del cronometro nello stesso formato con cui lo vedo in cella A4?
Chiedo questo perchè vorrei fare una Userform e con appositi bottoni richiamare il dispositivo per il cronometraggio ed eventuali archivi dei concorrenti.

Come puoi vedere, da una parte, faccio a fatica piccolissimi passi in avanti (e questo un pò mi demoralizza).
Ma, dall'altra, aumenta sempre più la curiosità a la voglia di apprendere. (spero di imparare il più possibile anche se mi rendo conto di avere serie difficoltà)
Grazie ancora.
Ciao.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 11/03/10 02:04

In linea di massima "macro che funziona e' cosa buona", in piu' non conoscendo l' operativita' non sono in grado di fare commenti saggi; modificherei comunque la sub Alt:
Codice: Seleziona tutto
Sub alt()
Dim iRow As Integer
iRow =Cells(Rows.Count).end(xlUp).Offset(1,0).Row
If iRow<5 then iRow=5
Cells(iRow, 2) = [A4]
'Cells(iRow, 4).select    '<<< Vedi Testo
[A4] = [A2] - [A3]
[B1] = 0
[B2] = 0
End Sub


Se vuoi mettere in una "variabile" di testo quello che visualizzi in A4 puoi usare direttamente
Codice: Seleziona tutto
Variab=[A4].text

Per mettere il nome del concorrente in una cella adiacente al tempo, beh la cosa piu' semplice e' scrivercelo; per questo puoi scommentare nella macro "alt" la linea marcata "<<< Vedi Testo" cosi' viene direttamente selezionata la cella adiacente al tempo (nell' esempio, la col D); oppure ti metti nelle celle di col D una convalida (Menu /Dati /Convalida) da elenco, avendo inserito in un elenco i nomi che vuoi poter scegliere. Ma altre automazioni sono possibili in funzione dell' operativita' richiesta e dallo skill.
Se hai l' impressione di fare piccoli passi avanti direi che sei sulla buona strada...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 12/03/10 23:23

Ciao Anthony, il lavoro sta procedendo bene grazie al tuo supporto e ai suggerimenti.
Sono ancora qui per chiedere, se possibile, avere spiegazioni riguardo al metodo migliore da adottare per calcolare, dal foglio di calcolo o dal VBA, la velocità media in km/h.
Il mio problema non è tanto la formula in se ma il tipo di formato da utilizzare, dato che i tempi li ho in mm:ss,00.
Come posso fare a trasformare il valore in quel formato in un semplice numero decimale?
Ossia scorporare: 60/mm, 3600/ss……etc…ho fatto diversi tentativi ma proprio non ne esco.
Mi sto perdendo in un bicchier d’acqua?

Anthony47 ha scritto:Se hai l' impressione di fare piccoli passi avanti direi che sei sulla buona strada...

ti sono estremamente grato,..grazie.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 12/03/10 23:41

Se hai una distanza in A2 e il tempo impiegato in B2, in formato "orario excel", allora avrai la velocita' media usando
Codice: Seleziona tutto
=A2/(B2*24)

Cioe' trasformi un "orario excel" (es 1:30:00) in un numero decimale di ore (quindi 1,5) usando "*24"

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 13/03/10 20:50

Grazie Anthony, dimmi se ho ben capito:
Significa che il cambio formato mm,ss,00 diventa soltanto una necessità per la sola visualizzazione e non per eventuali calcoli;.. quindi Excel, in ogni caso, continua sempre a considerarlo in formato gg.hh.mm.ss,00
Dico bene?

Un’altra domanda:
Esiste una sola formula in Excel oppure un codice in VBA che mi consenta sempre di ricavare il risultato tra la differenza dell’ultimo valore ed il penultimo di una colonna che ciclicamente si riempie?
Dalle immagini spero si riesca meglio a comprendere
ImmagineImmagine
Grazie.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi ricky53 » 14/03/10 00:26

Ciao Charly,
prova con

Codice: Seleziona tutto
    RR = Range("G" & Rows.Count).End(xlUp).Row
    [I4] = Cells(RR, 7) - Cells(RR - 1, 7)


Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 15/03/10 01:08

La cosa piu' veloce e' che integri il codice di Ricky in una "UDF"; es
Codice: Seleziona tutto
Function Delta(Col, Optional Scarto As Integer = 0)
'Calcola la differenza tra "ultimo" e "penultimo" valore in una colonna di dati contigui
'COL puo' essere una cella, o un range; usato per impostare la colonna del calcolo
'    Impatta anche il ricalcolo: automatico se l' ultima cella e' nel range Col
'        manuale se e' esterno al range Col
'[Scarto], opzionale; sposta il calcolo in avanti (+) o indietro(-)
'Esempi di Uso:
'=DELTA(A1) Calcolo eseguito in col A, ricalcolo manuale
'=DELTA(A1:A1000) Calcolo eseguito in col A, ricalcolo Automatico se ultima riga e'
'      inferiore a 1000
'=DELTA(A:A) Calcolo eseguito in col A, ricalcolo sempre Automatico
'
Dim LastR As Single
LastR = Cells(Rows.Count, Col.Column).End(xlUp).Row + Scarto
Delta = Cells(LastR, Col.Column) - Cells(LastR - 1, Col.Column)
End Function

La macro e' di tre righe, tutto il resto e' la descrizione su come usarla.
Metti il codice in Modulo 1 e poi usa la funzione DELTA nelle formule.

La cosa piu' istruttiva sarebbe invece imparare a trovare la riga contenente l' ultimo dato in una colonna e poi usare quel valore in una funzione idonea, tipo Indice oppure Indiretto, per fare i calcoli che si vuole; ad esempio trovi l' ultima riga occupata con qualcosa come
Codice: Seleziona tutto
=GRANDE(SE(F1:F2000<>"";RIF.RIGA(F1:F2000);"");1)
Da confermare con Contr-Maiusc-Enter. L' "1" in fondo significa "ultimo", se volessi il penultimo basra scrivere "2"; questa lavora sull' intervallo F1:F2000 (quindi colonna F, max 2000 dati); ma puoi allungare quasi a piacere l' altezza, mentre la colonna basta usare quella giusta.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 15/03/10 18:36

Un grazie sincero anche a te Ricky, il codice che mi hai suggerito è proprio quello che chiedevo: l'ho inserito e funziona benissimo.
Come del resto il tuo Anthony, o meglio i tuoi suggerimenti.
Ho provato a vedere la funzionalità delle tre possibilità che mi hai passato e le ho trovate davvero interessanti.
Non ho afferrato bene come far funzionare l'ultima formula: qualsiasi valore abbia inserito nella colonna F, la cella dove inserisco la formula mi restituisce come valore "1"Immagine
Evidentemente sbaglio qualcosa e nonostante a volte mi illuda di 'saperne', devo ammettere che ho dei limiti notevoli.
Comunque non mollo:
quante cose sto imparando leggendo qua e la nel vostro forum, ma è soprattutto grazie a voi sento che posso crescere, perché in questo straordinario mondo cibernetico, voi siete dei veri angeli.
Grazie per gli aiuti.
A presto.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 15/03/10 20:58

La formula va inserita con Contr-Maiusc-Enter, non col solo Enter; la vedrai racchiusa tra parentesi graffe.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 15/03/10 22:19

Hai ragione Anthony, ora che l'ho inserita con Contr-Maiusc-Enter mi ritorna il risultato fedele alla tua spiegazione.
Anche questa formula è preziosa nel caso di applicazioni mirate, la conservò certamente nella mia cartella dei file Excel.
Ora sto trovando il modo per trasferire pacchetti di dati da un foglio in un'altro, l'obiettivo è di creare per ogni concorrente una sorta di storico da poter stampare su cartaceo.
Credo/spero di aver imboccato 'la strada giusta', al termine posterò il codice per eventuali vostre osservazioni.
Grazie ancora per la disponibilità.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 21/03/10 21:26

Ciao ragazzi, rieccomi di nuovo a tediarvi con i miei limiti.
Sono sempre alle prese con il solito cronometro.
Con questo codice riesco ad adattare la UserForm a uno schermo da 15" e ad un'altro da 17".
Codice: Seleziona tutto
Private Sub UserForm_Initialize()
With UserForm1
.StartUpPosition = 3
.Width = Application.Width
.Height = Application.Height
End With
End Sub
Immagine Schermo 15"Immagine Schermo 17"
Quel che non mi riesce e di adattare in proporzione anche il resto.
Mi riferisco alla Page e agli oggetti contenuti all'interno.
Sapreste dirmi se è possibile ottenere un'ingrandimento o un ridimensionamento proporzionale.
Spero di essermi spiegato e che si possa fare.
Grazie.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 22/03/10 00:36

Guarda questa discussione: viewtopic.php?f=26&t=69904
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 23/03/10 08:54

Grazie mille Anthony, il codice funzione alla perfezione: ed era giusto quello che chiedevo.
.. e mi scuso per non aver da subito utilizzato il tasto cerca: avrei certamente evitato di farti perdere tempo prezioso. :oops:
Ciao.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Charly_new » 26/03/10 11:38

Ciao a tutti.
Per poter interagire con i segnali provenienti dalla porta parallela mi è stato passato questo codice
Codice: Seleziona tutto
Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
da inserire nel progetto.. e il file inpout32.dll da copiare nella cartella di WINDOWS/system32.
Sembra tutto corretto se non che, all'apertura del progetto, mi si presenta questo messaggio di errore:Immagine
Si tratta di un codice che non si può conciliare con con il VBA di Excel..oppure c'è un metodo diverso per raggiungere il mio scopo?
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Realizzare un cronometro in VBA

Postdi Anthony47 » 26/03/10 11:49

Queste "dichiarazioni" vanno messe in cima al modulo, prima di qualsiasi macro.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Realizzare un cronometro in VBA":


Chi c’è in linea

Visitano il forum: Nessuno e 71 ospiti