我想下面的公式轉換爲一個函數在Excel中寫一個函數:從公式
=REPLACE(REPLACE(R1C1,10,3,(ROUND((RIGHT(R1C1,3)*29.97)/1000,0))),9,1,"";"")
這樣做是需要時間碼是這樣的:00:01:35,748
並把它變成這樣:00:01:35;22
我不知道如何將現有的函數放入一個自定義函數,結果如何。
我想下面的公式轉換爲一個函數在Excel中寫一個函數:從公式
=REPLACE(REPLACE(R1C1,10,3,(ROUND((RIGHT(R1C1,3)*29.97)/1000,0))),9,1,"";"")
這樣做是需要時間碼是這樣的:00:01:35,748
並把它變成這樣:00:01:35;22
我不知道如何將現有的函數放入一個自定義函數,結果如何。
打開VBA編輯器(按Alt-F11),選擇從插入菜單 「插入模塊」,然後鍵入以下(更新更好的代碼的做法 - 感謝@用於輸入ja72):
Option Explicit
Public Const fps = 29.97 ' frames per second
Function timeCode(s)
' take a string as input
' find the fractional time
' and convert to frame number like 00:01:35,748
' and turn it into this: 00:01:35;22
Dim comma, fraction, frameNum, frameInSec
comma = InStr(1, s, ",")
fraction = Mid(s, comma + 1, Len(s))
' convert to seconds regardless of number of digits:
frameInSec = Val(fraction)/(10^Len(fraction))
frameNum = Application.WorksheetFunction.Round(frameInSec * fps, 0)
timeCode = Left(s, comma - 1) & ";" & frameNum
End Function
現在你將能夠進入像
=timeCode("00:01:35,748")
公式到您的電子表格,結果將是
00:01:35;22
這是你想要的東西......
不是字符串的,當然你也可以使用單元格引用 - 因此,如果您在單元格A1有"00:01:35,748"
,你可以在B1單元格中鍵入
=timeCode(A1)
(例如)並得到你想要的結果。自定義功能 - 強大的東西。
編輯的特殊要求(一價兩個... ...):改變了格式化輸出字符串與;
經常更換:
,使幀數兩位數字(與領先的零,如果需要的話) :
Dim tempString
tempString = Left(s, comma - 1) & ";" & Format(frameNum, "00")
timeCode = Replace(tempString, ":", ";")
,你把這個在上面的代碼很明顯......
太棒了!但現在我有另一個要求。我們可以讓這個函數做到這一點:取00:00:00; 0並把冒號變成分號(我只是在做一個查找和替換之前),然後強制最終的0總是以2位數的格式所以a; 4將永遠是04; – user3000617
是的,你可以。在最後看到我的編輯。 – Floris
讓我們大飽口福吧!謝謝!你真是太棒了!我會把你列入我在火雞桌上感謝的事情清單。 – user3000617
你想一個[UDF(http://office.microsoft.com/en-gb/excel-幫助/創建定製函數功能於Excel的2007 HA010218996.aspx)? – pnuts
它看起來像你正在將時間轉換爲幀數(這就是爲什麼你有29.97)對嗎? – Floris
是的,這正是這個。我正在將.srt時間碼文件轉換爲與adobe encore for subtitles兼容的文件。 – user3000617