2013-11-25 35 views
1

我想下面的公式轉換爲一個函數在Excel中寫一個函數:從公式

=REPLACE(REPLACE(R1C1,10,3,(ROUND((RIGHT(R1C1,3)*29.97)/1000,0))),9,1,"";"") 

這樣做是需要時間碼是這樣的:00:01:35,748並把它變成這樣:00:01:35;22

我不知道如何將現有的函數放入一個自定義函數,結果如何。

+0

你想一個[UDF(http://office.microsoft.com/en-gb/excel-幫助/創建定製函數功能於Excel的2007 HA010218996.aspx)? – pnuts

+0

它看起來像你正在將時間轉換爲幀數(這就是爲什麼你有29.97)對嗎? – Floris

+0

是的,這正是這個。我正在將.srt時間碼文件轉換爲與adobe encore for subtitles兼容的文件。 – user3000617

回答

2

打開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, ":", ";") 

,你把這個在上面的代碼很明顯......

+0

太棒了!但現在我有另一個要求。我們可以讓這個函數做到這一點:取00:00:00; 0並把冒號變成分號(我只是在做一個查找和替換之前),然後強制最終的0總是以2位數的格式所以a; 4將永遠是04; – user3000617

+0

是的,你可以。在最後看到我的編輯。 – Floris

+1

讓我們大飽口福吧!謝謝!你真是太棒了!我會把你列入我在火雞桌上感謝的事情清單。 – user3000617