如何将分数作为字符串转换为数值?
strFrac = "3/2"
目前正在通过拆分字符串来获得分子和分母。
Dim x() As String
x = Split(strFrac, "/")
然后使用Val()
并分割。
v = Val(x(0)) / Val(x(1))
结果:v = 1.5
有更直接的方法吗?如果像Val("3/2")
这样的东西可行,那就太好了。
答案 0 :(得分:2)
您想要Application.Evaluate
Sub TEST()
Dim v As Double
Dim strFrac As String
strFrac = "3/2"
v = Application.Evaluate(strFrac)
Debug.Print v
End Sub
答案 1 :(得分:2)
Val
并非将字符串转换为数字。 在遇到非数字字符时停止读取字符串,并返回表示从字符串中提取的数值的Double
。
那"工作"为了您的目的,但CDbl
转换功能更合适。
如果您使用Excel,Scott's answer会利用Excel的计算引擎逐字地Evaluate
字符串,这就是您正在寻找的内容。副作用是字符串现在可以包含Excel函数和单元格引用,结果仍然会被评估。
如果评估返回错误值(例如Evaluate("12/0")
),那么如果您将结果直接分配给Double
,则会遇到类型问题。相反,将结果分配给Variant
,并使用IsError
函数验证它没有返回错误 - 这将使您免于运行时错误13 /"类型失配"
如果您不在Excel中,那么您也无法做到 - 并且您也不想仅为此引用Excel对象模型 - 因此您的解决方案确实是最简单的。< / p>
答案 2 :(得分:0)
如果您不想将解决方案与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
此解决方案来自Microsoft网站https://support.microsoft.com/en-us/help/185424/how-to-convert-a-fraction-to-a-decimal-number