Джон работает в телеиндустрии, где синхронизация выполняется с разрешением менее секунды. Телевизионное видео должно учитывать часы, минуты, секунды и кадры. (Есть тридцать кадров в секунду.) Джону было интересно, есть ли способ обрабатывать кадры в Excel.

Нет возможности обрабатывать кадры как часть собственных значений времени в Excel. (В телевизионной индустрии значение времени, включающее кадры, часто называют «тайм-кодом» или «временным кодом».) Однако есть несколько вещей, которые вы можете сделать для работы с кадрами. Возможно, наиболее очевидное предложение — сохранить часы, минуты и секунды как обычные значения времени, а затем поместить кадры в отдельную ячейку. Непосредственным недостатком этого подхода является то, что вычисление «времени просмотра ТВ» не так просто, как если бы они были представлены в виде одного значения.

Чтобы решить эту проблему, попробуйте выполнить свои собственные вычисления в макросе.

В Excel проходит внутренний процесс преобразования времени в десятичные значения, с которым очень легко работать. Вы можете смоделировать этот же процесс преобразования, преобразовав значение времени (включая кадры) в десятичное значение. Время ТВ в формате 00: 29: 10: 10 может быть сохранено в ячейке (где Excel будет рассматривать его как строку), а затем преобразовано в значение с помощью макроса.

Конечно, здесь есть проблема: вы не можете преобразовать время в истинное десятичное значение от 0 до 1, как это делает Excel для раз. Причина связана с ограничением значащих цифр Excel. Чтобы получить значение, вы должны разделить часы на 24, минуты на 1440 (24 60), секунды на 86400 (24 60 60) и кадры на 2592000 (24 60 60 30, если вы работаете с 30 кадрами. в секунду). Когда вы начинаете получать такие маленькие значения, это выходит за пределы ограничений Excel по поддержанию всего до пятнадцати значимых цифр. Таким образом, вы получите неизбежные ошибки округления значения кадров.

Одно из решений этой проблемы — не пытаться работать с десятичными значениями от 0 до 1, а вместо этого работать с целыми числами. Если вы преобразуете строку 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

Чтобы увидеть, как это работает, если у вас есть строка, например 37: 15: 42: 06 в ячейке A4, и вы используете формулу = 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

Комбинируя две функции, вы можете вычислить время. Например, предположим, что у вас есть время 00: 29: 10: 10 в ячейке A4 и время 00: 16: 12: 23 в ячейке A5. Если вы поместите следующую формулу в ячейку, вы сможете узнать разницу между двумя значениями времени:

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

Результат 00: 12: 57: 17.

Представленные здесь примеры являются элементарными; они не принимают во внимание обработку ошибок или проверку ограничений по используемому времени. Вы можете расширить примеры в соответствии со своими потребностями или обратиться к стороннему источнику. Например, вы можете найти объяснение (с образцом рабочей книги) для времени NTSC и PAL по следующему URL-адресу:

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

В Интернете есть и другие решения на основе макросов.

Лучше всего использовать вашу любимую поисковую систему и искать «timecode excel» или «time code excel» (без кавычек). Вы найдете множество примеров кода, с которых можно начать.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (8353) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:

link: / excel-Calculating_TV_Time [Расчет времени ТВ].