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)。当您开始使用这么小的值时,它超出了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 T2D As Long

Application.Volatile          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 * 30 + 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 RemainingTime As Long

Application.Volatile

NumHours = Raw \ (CLng(30  60)  60)

RemainingTime = Raw Mod (CLng(30  60)  60)



NumMinutes = RemainingTime \ (60 * 30)

RemainingTime = RemainingTime Mod (60 * 30)



NumSeconds = RemainingTime \ 30     RemainingTime = RemainingTime Mod 30

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

注意:

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

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

本技巧(3100)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: