John在电视行业工作,在该行业中,计时的分辨率要优于1秒钟。电视视频必须考虑小时,分钟,秒和帧。 (每秒有30帧。)John想知道是否存在一种在Excel中处理帧的方法。

无法将帧作为Excel中本地时间值的一部分进行处理。 (在电视行业中,包含帧的时间值通常称为“时间码”或“时间码”。)但是,您可以做一些事情来处理帧。也许最明显的建议是将小时,分钟和秒保持为常规时间值,然后将帧放在单独的单元格中。这种方法的直接缺点是“电视时间”的计算不像用单个值表示时那样容易。

一种解决方法是尝试在宏中进行自己的计算。

Excel经历了将时间转换为十进制值的内部过程,可以很容易地使用它。您可以模拟相同的转换过程,将时间值(包括帧)转换为十进制值。电视时间的格式为00:29:10:10,可以存储在一个单元格中(Excel将在其中将其视为字符串),然后由宏将其转换为值。

当然,这里有一个问题:您不能像Excel那样将时间转换为介于0和1之间的真实十进制值。原因与Excel有效数字的限制有关。要获得一个值,您可以将小时数除以24,将分钟数除以1440(24 60),将秒数除以86400(24 60 60),将帧数除以2592000(24 60 60 30),假设您工作的帧数为30每秒)。当您开始使用这么小的值时,它超出了Excel将所有内容保持在15位有效数字范围内的限制。因此,最终会在帧值上产生不可避免的舍入错误。

解决此问题的一种方法是不要尝试使用0到1之间的十进制值,而应使用整数。如果将字符串时间转换为代表时间中总帧数的整数值,则可以轻松地对结果值进行数学运算。

以下宏将以已经提到的格式进行字符串的转换:

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

若要查看其工作原理,如果单元格A4中有一个字符串,例如37:15:42:06,并且使用公式= Time2Num(A4),则结果为值4024266,即37中的帧数小时15分钟42秒和6帧。要将这些值转换回可以理解的时间,可以使用以下函数:

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

通过将这两个函数结合起来,您可以与时俱进。例如,假设您在单元格A4中具有时间00:29:10:10,在单元格A5中具有时间00:16:12:23。如果将以下公式放在一个单元格中,则可以找出两次之间的差:

=Num2Time(Time2Num(A4)-Time2Num(A5))

结果是00:12:57:17。

这里提供的示例是基本的;他们不考虑任何错误处理或使用时间限制检查。您可以根据需要扩展示例,也可以寻求第三方资源。例如,可以在以下URL上找到NTSC和PAL时间的解释(带有示例工作簿):

http://www.kenstone.net/fcp_homepage/timecode_spreadsheet.html

Internet上还有其他基于宏的解决方案。

最好的方法是使用您喜欢的搜索引擎并查找“ timecode excel”或“ time code excel”(不带引号)。您会发现很多可以开始使用的代码示例。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(8353)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本: