Condividi:        

excel emulazione tabellone elettronico

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

excel emulazione tabellone elettronico

Postdi wallace&gromit » 16/11/16 11:02

Ciao a tutti,
sto elaborando un progetto piuttosto corposo, che richiederà più di un aiuto!
riprendo quanto discusso con Anthony in questo topic: http://www.pc-facile.com/forum/viewtopic.php?f=26&t=102957&hilit=musica+excel in cui ho elaborato un sistema che mi permette di lanciare musiche di intrattenimento durante le interruzioni delle partite di hockey.

Ora vorrei rivoluzionare il tutto con un'idea completamente nuova, partendo dalla gestione di un tabellone che deve emulare quello reale che è visibile alla pista di ghiaccio.
Quello che ho elaborato finora si trova qui:
http://www.filedropper.com/macrocronometro
I pulsanti start e stop devono essere azionati in contemporanea con quelli reali della pista (sto verificando parallelamente se non sia possibile ricevere direttamente l'impulso sul mio PC, per essere sicuro che la sincronizzazione funzioni).

Il primo problema nasce dal fatto che il comando onTime si basa sull'orologio del PC e si aggiorna sempre al secondo pieno (+ o - al centesimo), come si vede nella cella M1. Al momento della pressione però siamo in una frazione del secondo attuale, succede quindi che il primo secondo che passa dopo il lancio della macro può durare da quasi nulla a quasi 2 sec, sfasando il sincronismo con il tabellone. Anche i tasti di sincronizzazione non funzionano a dovere, perché dovrebbero servire a fare scattare immediatamente il numero, come lo vedo sul tabellone. C'è qualche altro comando che funziona in questo senso? P.es. se premo F9 in M1 vedo i centesimi precisi!

Il secondo problema mi lascia allibito!
Quando manca 1 minuto alla fine dei tempi 1 e 2, quindi quando M5 segna 19:00 o 39:00, deve scattare un messaggio. Con 19 funziona e con 39 no!
Per provare mettete 1 in M4 e 01:05 in M2, start, dopo 5 secondi esce il messaggio
Mettete 2 in M4 e 01:05 in M2, start, dopo 5 secondi non succede nulla!
eppure la macro prevede i due casi distinti

Alla fine del 3° tempo un altro messaggio deve uscire a 58:00, questo funziona!
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Sponsor
 

Re: excel emulazione tabellone elettronico

Postdi Anthony47 » 16/11/16 15:39

La cosa apparentemente inspiegabile dipende dalle approssimazioni.
Quando siamo a 39:00 la differenza tra la cella e il calcolo e' pari a -3,46944695195361E-18 (sul mio Pc): poco, ma sufficiente a far fallire l'uguaglianza. Mi meraviglia piuttosto che funzioni a 0:19:00.
La cosa piu' semplice e' che inserisci un arrotondamento alle 10 cifre:
Codice: Seleziona tutto
If Round(Foglio1.Range("m5"), 10) = Round(19 / 24 / 60, 10) Then

(su tutte le uguaglianze)

Per il primo problema non ho una un'idea precisa... Probabilmente dovresti vedere come sincronizzare l'orologio del pc con quello del campo usando l'istruzione Time.
Purtoppo temo che questo sia da fare a ogni interruzione /riavvio del timer, non so se in pratica sia possibile.

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

Re: excel emulazione tabellone elettronico

Postdi wallace&gromit » 16/11/16 17:17

1E-18, chiamarlo poco è un eufemismo!
ok, quel problema è risolto con l'approssimazione.

Per l'altro problema avevo pensato anche io (tempendo però di fare grossi casini) ad agire sul timer del PC.
Comunque riprovando varie volte ho visto che non succede sempre quello che dico io: se avvio il timeout sì, e quando subentra un'altra macro anche, ma quando lancio normalmente con start inizia giusto, poi dopo un po' di secondi si incarta da solo e perde un po' di tempo, ma non c'entra il secondo pieno del timer PC.
Mah, mi sa che sto spingendo excel oltre le sue capacità, oramai me lo tengo così e faccio un po' di prove per vedere se può essere veramente un problema.

Intanto grazie e a presto per altre domande... la strada è ancora lunga, perché l'obiettivo è di tenere un report di tutto quel che succede, poi ci sono le penalità che devono essere controllate ed eventualmente cancellate dopo ogni gol e alla fine devo integrare la musica del programma precedente, in modo che premendo stop parte in automatico.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: excel emulazione tabellone elettronico

Postdi Anthony47 » 17/11/16 13:27

1E-18, chiamarlo poco è un eufemismo!
Eh, Excel e' piu' preciso di un cucu' svizzero

Pero' ci sono ancora un paio di cose da considerare...
Normalmente tendiamo a mettere l'istruzione OnTime in coda alla macro che deve ripetersi; ma quando si vuole ottenere un risultato temporizzato allora bisognerebbe metterlo in testa; in questo modo il rischio di perdere il secondo diminuisce.
Ma soprattutto i contatori dovrebbero essere aggiornati tramite il timer di sistema e non incrementando i contatori sul foglio; a questo punto potresti notare un ritardo nella visualizzazione del tuo contatore (che puoi ridurre sincronizzando, come detto prima, l'orologio del pc con quello del campo; ti basta sincronizzare "il secondo"), ma il contenuto rimane corretto e gli errori non si accumulano.
Se usi PC Windows, la funzione Timer restituisce frazioni di secondo (certamente fino ai centesmi). In Macintosh, la risoluzione del timer è pari a un secondo.

Infine c'e' da considerare che altre macro in esecuzione bloccano l'esecuzione della macro attivata con OnTime, fino alla loro End Sub; A MENO CHE all'interno di queste macro non ci siano istruzioni DoEvents che rilasciano momentaneamente il controllo a eventuale "eventi di sistema" pendenti. Ricordo che hai macro che attivavano i suoni, al loro interno devi posizionare dei DoEvents in posizione strategica.

Spero di aver dato qualche spunto ulteriore...
Avatar utente
Anthony47
Moderatore
 
Post: 19220
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: excel emulazione tabellone elettronico

Postdi wallace&gromit » 18/11/16 17:47

Ok, penso di avere capito correttamente le tue istruzioni:
in M1 faccio scrivere l'ora della pressione di start, precisa al centesimo.
in O1 scrivo l'ora precisa dello stop
e con questa macro resetto il valore che figura sul mio tabellone virtuale:

Codice: Seleziona tutto
Sub stoptimer()
On Error Resume Next
istante = Int(Now()) + Timer / 60 / 60 / 24
Foglio1.Range("o1") = istante
Application.OnTime Now + TimeValue("00:00:01"), "nexttick", , False
Foglio1.Range("m2") = Foglio1.Range("o2") + Foglio1.Range("m1") - Foglio1.Range("o1")
Foglio1.Range("o2") = Foglio1.Range("m2")
End Sub


Per la musica non è un problema perché si attiverà solamente quando il timer è fermo.
Anzi, uno stimolo a modificare il sistema attuale è giunto proprio dal fatto che durante una partita recente non ho spento la musica durante il gioco e gli arbitri me lo hanno fatto notare (molto gentilmente ovviamente :aaah , poi a fine partita però erano molto interessati su come funzionasse il tutto).

Con il nuovo sistema premendo start la musica si arresterà immediatamente in ogni caso.

Questo WE mi porterò un po' avanti col progetto e mi farò senz'altro ancora vivo.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: excel emulazione tabellone elettronico

Postdi wallace&gromit » 20/11/16 15:45

Eccomi puntuale con una domanda:
la seguente funzione deve verificare se una delle scadenze in P11,P12,V11 o V12 coincide con il tempo del cronometro in M5.
Se sì deve verificare se vi sono altre scadenze in attesa, che possono essere alle righe 15 o 16.
Se ne trova una deve tagliare da quella posizione (riga 15 o 16) e incollare nella riga esaminata (11 o 12), senza incrociare: dalla colonna P sempre solo i valori delle colonne N e O, mentre dalla colonna V sempre T e U.
Il mio codice dà un problema, perché ho altre celle con formule che fanno riferimento alle celle di destinazione del mio incolla, in seguito all'incolla queste danno errore #RIF!.
Poi mi piacerebbe snellire il tutto, se possibile.
Codice: Seleziona tutto
Function CheckPenality()
DoEvents
If Round(Foglio1.Range("P11"), 10) = Round(Foglio1.Range("M5"), 10) Then
    If Foglio1.Range("N15") <> "" Then
    Foglio1.Range("N15:O15").Cut Destination:=Foglio1.Range("N11:O11")
    Foglio1.Range("P11") = Foglio1.Range("P11") + Foglio1.Range("O11") / 24 / 60
    GoTo prossimo1
    End If
    If Foglio1.Range("N16") <> "" Then
    Foglio1.Range("N16:O16").Cut Destination:=Foglio1.Range("N11:O11")
    Foglio1.Range("P11") = Foglio1.Range("P11") + Foglio1.Range("O11") / 24 / 60
    End If
End If
prossimo1:
If Round(Foglio1.Range("P12"), 10) = Round(Foglio1.Range("M5"), 10) Then
    If Foglio1.Range("N15") <> "" Then
    Foglio1.Range("N15:O15").Cut Destination:=Foglio1.Range("N12:O12")
    Foglio1.Range("P12") = Foglio1.Range("P12") + Foglio1.Range("O12") / 24 / 60
    GoTo prossimo2
    End If
    If Foglio1.Range("N16") <> "" Then
    Foglio1.Range("N16:O16").Cut Destination:=Foglio1.Range("N12:O12")
    Foglio1.Range("P12") = Foglio1.Range("P12") + Foglio1.Range("O12") / 24 / 60
    End If
End If
prossimo2:
If Round(Foglio1.Range("V11"), 10) = Round(Foglio1.Range("M5"), 10) Then
    If Foglio1.Range("T15") <> "" Then
    Foglio1.Range("T15:U15").Cut Destination:=Foglio1.Range("T11:U11")
    Foglio1.Range("V11") = Foglio1.Range("V11") + Foglio1.Range("O11") / 24 / 60
    GoTo prossimo3
    End If
    If Foglio1.Range("T16") <> "" Then
    Foglio1.Range("T16:U16").Cut Destination:=Foglio1.Range("T11:U11")
    Foglio1.Range("V11") = Foglio1.Range("V11") + Foglio1.Range("O11") / 24 / 60
    End If
End If
prossimo3:
If Round(Foglio1.Range("V12"), 10) = Round(Foglio1.Range("M5"), 10) Then
    If Foglio1.Range("T15") <> "" Then
    Foglio1.Range("T15:U15").Cut Destination:=Foglio1.Range("T12:U12")
    Foglio1.Range("V12") = Foglio1.Range("V12") + Foglio1.Range("O12") / 24 / 60
    GoTo prossimo2
    End If
    If Foglio1.Range("T16") <> "" Then
    Foglio1.Range("T16:U16").Cut Destination:=Foglio1.Range("T12:U12")
    Foglio1.Range("V12") = Foglio1.Range("V12") + Foglio1.Range("O12") / 24 / 60
    End If
End If

End Function
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: excel emulazione tabellone elettronico

Postdi Anthony47 » 20/11/16 22:40

Hummm... secondo me e' piu' probabile che l'errore dipenda dalle formule che prima puntavano alle celle "tagliate".

Non usare Taglia /Incolla, sostituisci quindi
Foglio1.Range("N15:O15").Cut Destination:=Foglio1.Range("N11:O11")
Con
Codice: Seleziona tutto
Foglio1.Range("N11:O11").Value = Foglio1.Range("N15:O15").Value
Foglio1.Range("N15:O15").ClearContents

Analoga cosa con gli intervalli "N11:O11" / "N16:O16" e altri sei casi simili.

Un certo snellimento lo potresti avere creando strutture del tipo
Codice: Seleziona tutto
If Foglio1.Range("N15") <> "" Then
    Foglio1.Range("N11:O11").Value = Foglio1.Range("N15:O15").Value
    Foglio1.Range("N15:O15").ClearContents
    Foglio1.Range("P11") = Foglio1.Range("P11") + Foglio1.Range("O11") / 24 / 60
EsleIf Foglio1.Range("N16") <> "" Then
    Foglio1.Range("N11:O11").Value = Foglio1.Range("N16:O16").Value
    Foglio1.Range("N16:O16").ClearContents
    Foglio1.Range("P11") = Foglio1.Range("P11") + Foglio1.Range("O11") / 24 / 60
End If


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


Torna a Applicazioni Office Windows


Topic correlati a "excel emulazione tabellone elettronico":


Chi c’è in linea

Visitano il forum: Nessuno e 48 ospiti