ジョンはテレビ業界で働いており、タイミングは1秒よりも細かい解像度で行われます。テレビビデオは、時間、分、秒、およびフレームを考慮に入れる必要があります。 (1秒あたり30フレームあります。)ジョンは、Excelでフレームを処理する方法があるかどうか疑問に思っていました。

Excelでネイティブ時間値の一部としてフレームを処理する方法はありません。 (テレビ業界では、フレームを含む時間値は「タイムコード」または「タイムコード」と呼ばれることがよくあります。)ただし、フレームを操作するためにできることがいくつかあります。おそらく最も明白な提案は、時間、分、秒を通常の時間値として保持し、フレームを別のセルに配置することです。このアプローチの直接の欠点は、「TV時間」の計算が、単一の値で表された場合ほど簡単ではないことです。

これを回避する方法は、マクロで独自の計算を実行することです。

Excelは、時間を非常に簡単に処理できる10進値に変換する内部プロセスを実行します。これと同じ変換プロセスをシミュレートして、時間値(フレームを含む)を10進値に変換することができます。 00:29:10:10の形式のTV時刻は、セル(Excelは文字列として処理します)に格納してから、マクロによって値に変換できます。

もちろん、ここには問題があります。Excelが時間に対して行うように、時間を0から1の間の真の10進値に変換することはできません。その理由は、Excelの有効数字の制限に関係しています。値に到達するには、時間を24で、分を1440(24 60)で、秒を86400(24 60 60)で、フレームを2592000(24 60 60 30で、30フレームで作業していると仮定)で除算します。毎秒)。非常に小さい値になり始めると、すべてを有効数字15桁に維持するというExcelの制限を超えます。したがって、フレーム値で避けられない丸め誤差が発生します。

この問題の解決策の1つは、0から1までの10進値ではなく、整数で作業することです。文字列timeを、時間内の合計フレーム数を表す整数値に変換すると、結果の値を簡単に計算できます。

次のマクロは、すでに説明した形式の文字列の変換を実行します。

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

2つの関数を組み合わせることで、時間でいくつかの計算を行うことができます。たとえば、セルA4に時刻00:29:10:10があり、セルA5に時刻00:16:12:23があるとします。次の数式をセルに入力すると、2つの時間の違いを見つけることができます。

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

結果は00:12:57:17です。

ここに示されている例は基本的なものです。エラー処理や使用時間の制限チェックは考慮されていません。ニーズに合わせて例を拡張することも、サードパーティのソースを探すこともできます。たとえば、次のURLでNTSCおよびPAL時間の説明(サンプルワークブックを使用)を見つけることができます:

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

インターネットには他にもマクロベースのソリューションがあります。

最善のアプローチは、お気に入りの検索エンジンを使用して、「タイムコードエクセル」または「タイムコードエクセル」(引用符なし)を探すことです。始めることができるコードの例がたくさんあります。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(8353)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。