从公式中编写函数

时间:2013-11-25 23:11:32

标签: excel vba excel-vba

我正在尝试将以下公式转换为excel中的函数:

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

这样做会采用如下时间码:00:01:35,748并将其转换为:00:01:35;22

我不知道如何将现有函数放入自定义函数以及结果如何。

1 个答案:

答案 0 :(得分: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",则可以键入

=timeCode(A1)
单元格B1中的

(例如)并获得所需的结果。自定义功能 - 功能强大。

根据特殊要求

编辑(两个价格为一个...):更改输出字符串的格式以将:替换为;,然后进行帧编号总是两位数(如果需要,前导零):

Dim tempString
tempString = Left(s, comma - 1) & ";" & Format(frameNum, "00")
timeCode = Replace(tempString, ":", ";")

显而易见的是,您将其放在上面的代码中......