有没有办法将有效数字的规则应用于Excel工作表,即从宏中打印值?
或者以任何方式,VBA宏计算的值都会通过有效数字规则而不是打印在excel表上?
答案 0 :(得分:2)
以下是有效数字的公式:
=ROUND(REFERENCE,SIGFIGS-1-INT(LOG10(ABS(REFERENCE))))
例如,如果您希望A1中的值为3位有效数字,则可以输入:
=ROUND(A1,2-INT(LOG10(ABS(A1))))
编辑:如果你愿意的话,我只是把一个快速的VBA宏汇集到一个选择中的每个单元格中:
Sub ConvertToSigfigs()
Dim Sigfigs As Integer
Sigfigs = 3 'Change this to whatever value you want
Dim cel As Range
For Each cel In Selection
cel.Value = Application.WorksheetFunction.Round(cel.Value, Sigfigs - 1 - Int(Application.WorksheetFunction.Log10(Abs(cel.Value))))
Next
End Sub
注意我使用了Application.WorksheetFunction.Round()而不是VBA的Round(),所以它可以使用非十进制数字。
编辑2:这是一个UDF:
Function Sigfig(Inpt As Double, Precision As Integer) As Double
Sigfig = Application.WorksheetFunction.Round(Inpt, Precision - 1 - Int(Application.WorksheetFunction.Log10(Abs(Inpt))))
End Function
编辑3:这不会做的一件事是保留终端零,例如如果你有4.0001并且舍入到三个sig figs,excel将显示4,而不是4.00。如果绝对需要,可以根据模数在子中添加格式。
一个简洁的项目是使用UDF,然后有一个sub来解析UDF,然后将其转换为Excel公式,这样你就不必另存为.xlam。
答案 1 :(得分:0)
我一直在研究一个VBA用户定义函数,用有效数字或有限数量的小数进行科学舍入,这就是我在宏中使用的组合。
要在'= SciRound(B3,3)'等工作表上使用,请按Alt + F11打开Visual Basic编辑器,然后从插入菜单中添加一个模块。将代码复制/粘贴到Module1中然后使用 比如'= SciRound(数字或单元格位置为圆形,SigFigs,小数位)'
Public Function SciRound(number, sigfigs, Optional decimals As Variant)
' Nov2013 TP
Dim exp As Integer, n As Integer
Dim bdec As Boolean, test As Variant
If (IsEmpty(number) Or IsMissing(number)) = True Then SciRound = CVErr(xlErrNull)
If IsNumeric(number) = False Then SciRound = CVErr(xlErrValue)
If (IsNumeric(sigfigs) = False) Or (sigfigs < 1) Then SciRound = CVErr(xlErrValue)
If (IsMissing(decimals) Or IsEmpty(decimals)) = True Then bdec = False Else bdec = True
If bdec = True Then
If (IsNumeric(decimals) = False) Then SciRound = CVErr(xlErrValue)
If (Int(decimals) <> decimals) Then SciRound = CVErr(xlErrNum)
End If
If IsError(SciRound) = True Then Exit Function
If number = 0 Then SciRound = 0: Exit Function
number = CDec(number): test = Abs(number): n = 0
n = Int((Log(test) / Log(10#))) ' natural log to log10
exp = (sigfigs - n) - 1
If bdec = True Then
If (exp < decimals) Then bdec = False
End If
If bdec = True Then
SciRound = Round((number * 10 ^ decimals), 0) * 10 ^ -decimals
Else
SciRound = Round((number * 10 ^ exp), 0) * 10 ^ -exp
End If
End Function