Calcolo dell’ora della TV (Microsoft Excel)
John lavora nel settore televisivo, dove il tempismo è fatto con una risoluzione più fine di un secondo. Il video televisivo deve tenere conto di ore, minuti, secondi e fotogrammi. (Ci sono trenta frame al secondo.) John si chiedeva se ci fosse un modo per gestire i frame in Excel.
Non è possibile gestire i frame come parte dei valori temporali nativi in Excel. (Nell’industria televisiva un valore temporale che include i frame viene spesso definito “timecode” o “time code”.) Tuttavia, ci sono un paio di cose che puoi fare per lavorare con i frame. Forse il suggerimento più ovvio è quello di mantenere ore, minuti e secondi come un valore di tempo regolare, quindi inserire i frame in una cella separata. Lo svantaggio immediato di questo approccio è che i calcoli per i “tempi TV” non sono così facili come sarebbero se fossero rappresentati in un unico valore.
Un modo per aggirare questo è provare a fare i tuoi calcoli in una macro.
Excel passa attraverso un processo interno di conversione dei tempi in valori decimali che possono essere utilizzati molto facilmente. È possibile simulare lo stesso processo di conversione, convertendo un valore temporale (inclusi i frame) in un valore decimale. L’ora della TV, nel formato 00: 29: 10: 10, potrebbe essere memorizzata in una cella (dove Excel la tratterà come una stringa) e quindi convertita in un valore dalla macro.
C’è un problema qui, ovviamente: non puoi convertire l’ora in un vero valore decimale compreso tra 0 e 1 come fa Excel per i tempi. Il motivo ha a che fare con i limiti delle cifre significative di Excel. Per arrivare a un valore, dividere le ore per 24, i minuti per 1440 (24 60), i secondi per 86400 (24 60 60) e i fotogrammi per 2592000 (24 60 60 30, assumendo che si stia lavorando a 30 fotogrammi al secondo). Quando inizi a entrare in valori così piccoli, supera i limiti di Excel di mantenere tutto a quindici cifre significative. Pertanto, si finisce con errori di arrotondamento inevitabili sul valore dei frame.
Una soluzione a questo problema è non provare a lavorare con valori decimali compresi tra 0 e 1, ma lavorare invece con numeri interi. Se converti il tempo della stringa in un valore intero che rappresenta il numero di fotogrammi totali nel tempo, puoi facilmente eseguire calcoli sul valore risultante.
La seguente macro eseguirà la conversione di una stringa nel formato già menzionato:
Function Time2Num(Raw) As Long Dim FirstColon As Integer Dim SecondColon As Integer Dim ThirdColon As Integer Dim NumHours As Integer Dim NumMinutes As Integer Dim NumSeconds As Integer Dim NumFrames As Integer Dim FrameRate As Integer Dim T2D As Long ' Change the following to the number of frames ' per second with which you are working FrameRate = 30 FirstColon = InStr(Raw, ":") SecondColon = InStr(FirstColon + 1, Raw, ":") ThirdColon = InStr(SecondColon + 1, Raw, ":") NumHours = Val(Mid(Raw, 1, FirstColon - 1)) NumMinutes = Val(Mid(Raw, FirstColon + 1, SecondColon - 1)) NumSeconds = Val(Mid(Raw, SecondColon + 1, ThirdColon - 1)) NumFrames = Val(Mid(Raw, ThirdColon + 1, Len(Raw))) T2D = CLng(NumHours) T2D = T2D 60 + NumMinutes T2D = T2D 60 + NumSeconds T2D = T2D * FrameRate + NumFrames Time2Num = T2D End Function
Per vedere come funziona, se hai una stringa come 37: 15: 42: 06 nella cella A4 e usi la formula = Time2Num (A4), il risultato è il valore 4024266, che è il numero di fotogrammi in 37 ore, 15 minuti, 42 secondi e 6 fotogrammi. Per riconvertire tali valori in un tempo comprensibile, è possibile utilizzare la seguente funzione:
Function Num2Time(Raw) As String Dim NumHours As Integer Dim NumMinutes As Integer Dim NumSeconds As Integer Dim NumFrames As Integer Dim FrameRate As Integer Dim RemainingTime As Long ' Change the following to the number of frames ' per second with which you are working FrameRate = 30 NumHours = Raw \ (CLng(FrameRate 60) 60) RemainingTime = Raw Mod (CLng(FrameRate 60) 60) NumMinutes = RemainingTime \ (60 * FrameRate) RemainingTime = RemainingTime Mod (60 * FrameRate) NumSeconds = RemainingTime \ FrameRate RemainingTime = RemainingTime Mod FrameRate NumFrames = RemainingTime Num2Time = Format(NumHours, "00") & ":" & _ Format(NumMinutes, "00") & ":" & _ Format(NumSeconds, "00") & ":" & _ Format(NumFrames, "00") End Function
Combinando le due funzioni, puoi fare un po ‘di matematica con i tempi. Ad esempio, supponi di avere l’ora 00: 29: 10: 10 nella cella A4 e l’ora 00: 16: 12: 23 nella cella A5. Se metti la seguente formula in una cella, puoi scoprire la differenza tra i due tempi:
=Num2Time(Time2Num(A4)-Time2Num(A5))
Il risultato è 00: 12: 57: 17.
Gli esempi qui presentati sono rudimentali; non tengono conto di alcuna gestione degli errori né limitano il controllo dei tempi utilizzati. Puoi espandere gli esempi per adattarli alle tue esigenze oppure puoi cercare una fonte di terze parti. Ad esempio, puoi trovare una spiegazione (con una cartella di lavoro di esempio) per i tempi NTSC e PAL al seguente URL:
http://www.kenstone.net/fcp_homepage/timecode_spreadsheet.html
Esistono anche altre soluzioni basate su macro che galleggiano su Internet.
L’approccio migliore è usare il tuo motore di ricerca preferito e cercare “timecode excel” o “time code excel” (senza virgolette). Troverai molti esempi di codice con cui iniziare.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (8353) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 ed Excel in Office 365. Puoi trovare una versione di questo suggerimento per la vecchia interfaccia del menu di Excel qui: