字符串分数到VBA中的值

时间:2017-06-06 17:33:41

标签: vba type-conversion

如何将分数作为字符串转换为数值?

strFrac = "3/2"

目前正在通过拆分字符串来获得分子和分母。

Dim x() As String
x = Split(strFrac, "/")

然后使用Val()并分割。

v = Val(x(0)) / Val(x(1))

结果:v = 1.5

有更直接的方法吗?如果像Val("3/2")这样的东西可行,那就太好了。

3 个答案:

答案 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