如何将字符串分数转换为数字值?VBA中的字符串分数值
strFrac = "3/2"
目前通过拆分字符串来获得分子和分母。
Dim x() As String
x = Split(strFrac, "/")
然后用Val()
分开。
v = Val(x(0))/Val(x(1))
结果:V = 1.5
有没有更直接的办法?如果像Val("3/2")
这样的东西可以工作会很好。
如何将字符串分数转换为数字值?VBA中的字符串分数值
strFrac = "3/2"
目前通过拆分字符串来获得分子和分母。
Dim x() As String
x = Split(strFrac, "/")
然后用Val()
分开。
v = Val(x(0))/Val(x(1))
结果:V = 1.5
有没有更直接的办法?如果像Val("3/2")
这样的东西可以工作会很好。
Val
来并没有真正转换字符串转换成数字。它在遇到一个非数字字符时停止读取字符串,并返回代表从字符串中提取的数字值的Double
。
该“工程”为您的目的,但CDbl
转换功能将更合适。
如果你在Excel中,Scott's answer利用Excel的计算引擎来字面上Evaluate
字符串,这正是你要找的。这样做的副作用是该字符串现在可以包含Excel函数和单元格引用,并且结果仍然会被计算。
如果评估返回错误值(例如Evaluate("12/0")
),那么如果将结果直接分配给Double
,则会遇到类型问题。相反,将结果分配给Variant
,并使用IsError
函数验证它没有返回错误 - 这将免除运行时错误13 /“类型不匹配”。
如果您不在Excel中,那么您不能这么做 - 并且您不希望仅为此引用Excel对象模型 - 所以您的解决方案确实是最简单的。
你想Application.Evaluate
Sub TEST()
Dim v As Double
Dim strFrac As String
strFrac = "3/2"
v = Application.Evaluate(strFrac)
Debug.Print v
End Sub
利用Excel的计算引擎,所以也会评估'“SUM(A:A)/ SUM(B:B)”'。很可能是解决OP问题的最简单方法。另一方面...它将代码绑定到Excel对象模型。 –
如果Evaluate的评估结果为错误值,会将运行时错误13提升到v; –
如果你不想配合解决Excel对象模型,这里是解决问题的另一种方式。
Function Frac2Num(ByVal X As String) As Double
Dim P As Integer
Dim N As Double
Dim Num As Double
Dim Den As Double
X = Trim$(X)
P = InStr(X, "/")
If P = 0 Then
N = Val(X)
Else
Den = Val(Mid$(X, P + 1))
If Den = 0 Then Error 11 ' Divide by zero
X = Trim$(Left$(X, P - 1))
P = InStr(X, " ")
If P = 0 Then
Num = Val(X)
Else
Num = Val(Mid$(X, P + 1))
N = Val(Left$(X, P - 1))
End If
End If
If Den <> 0 Then
N = N + Num/Den
End If
Frac2Num = N
End Function
该解决方案从微软网站https://support.microsoft.com/en-us/help/185424/how-to-convert-a-fraction-to-a-decimal-number
OP的解决方案有一个问题,那就是它不能处理“1 5/16" 。这对OP来说可能不是问题,但我提到它的完整性。 –
@BrianMStafford正确。 OP的实施非常天真!我想这只是“完成工作”=) –
@Brian,用例总是一个简单的分数(“分子/分母”)作为字符串。 – NOYB