Excel/VBA中有效数字和尾随零的用户定义函数的建议

Excel/VBA中有效数字和尾随零的用户定义函数的建议,vba,excel,user-defined-functions,significant-digits,Vba,Excel,User Defined Functions,Significant Digits,我在下面为工作中的Excel工作表编写了用户定义函数UDF。它四舍五入到有效数字,并且能够处理尾随的零 事实上,UDF按预期工作!唯一需要注意的是,它将数字转换为文本 然而,我只是有点怀疑我忽略了什么。与我发现的其他函数相比,例如,它似乎太简单了 Public Function ROUNDSF(num As Double, sigFig As Integer) Dim sigPlace As Integer Dim numFormat As String sigPlace = sigFig

我在下面为工作中的Excel工作表编写了用户定义函数UDF。它四舍五入到有效数字,并且能够处理尾随的零

事实上,UDF按预期工作!唯一需要注意的是,它将数字转换为文本

然而,我只是有点怀疑我忽略了什么。与我发现的其他函数相比,例如,它似乎太简单了

Public Function ROUNDSF(num As Double, sigFig As Integer)

Dim sigPlace As Integer
Dim numFormat As String

sigPlace = sigFig - (1 + Int(Log(num) / Log(10)))

numFormat = "0." & String(sigPlace, "0")

ROUNDSF= Format(num, numFormat)

End Function

我在这个UDF中忽略了什么?或任何建议?

如果希望它返回一个值,可以使用以下命令关闭UDF:

ROUNDSF = Val(Format(num, numFormat))
请记住,这将使用现有的默认格式,因此请确保没有,或者它与您的要求兼容

根据Vincent的评论,如果您的用户的区域设置可能使用的不是。使用Cdbl作为十进制分隔符:

ROUNDSF = CDbl(Format(num, numFormat))
您还应该捕获可能出现的-ve SigPlace值,如下所示:

Public Function ROUNDSF(num As Double, sigFig As Integer) As Double

    Dim sigPlace As Integer
    Dim numFormat As String

    sigPlace = sigFig - (1 + Int(Log(num) / Log(10)))

    If sigPlace < 0 Then sigPlace = 0

    numFormat = "0." & String(sigPlace, "0")

    ROUNDSF = Cdbl(Format(num, numFormat))

End Function

代码评审通常是代码评审站点的候选。如果你没有实际的编程问题,这基本上是要求代码审查。@QHarr,我不知道有这样的网站,当然有。下次我会记住这个的。非常感谢。这是一个很好的网站:-请记住阅读他们的“如何提问”页面。格式为。将使用由系统或应用程序定义的当前十进制分隔符,并且可以使用,例如根据区域设置使用,但是Val是独立于区域设置的,并且总是期望使用。作为十进制分隔符,因此您的代码将仅在区域设置上工作,其中,`是十进制分隔符。使用CDbl获取正确的区域设置小数分隔符。