2017-06-06 76 views
1

如何将字符串分数转换为数字值?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")这样的东西可以工作会很好。

回答

2

Val来并没有真正转换字符串转换成数字。它在遇到一个非数字字符时停止读取字符串,并返回代表从字符串中提取的数字值的Double

该“工程”为您的目的,但CDbl转换功能将更合适。

如果你在Excel中,Scott's answer利用Excel的计算引擎来字面上Evaluate字符串,这正是你要找的。这样做的副作用是该字符串现在可以包含Excel函数和单元格引用,并且结果仍然会被计算。

如果评估返回错误值(例如Evaluate("12/0")),那么如果将结果直接分配给Double,则会遇到类型问题。相反,将结果分配给Variant,并使用IsError函数验证它没有返回错误 - 这将免除运行时错误13 /“类型不匹配”。

如果您不在Excel中,那么您不能这么做 - 并且您不希望仅为此引用Excel对象模型 - 所以您的解决方案确实是最简单的。

+1

OP的解决方案有一个问题,那就是它不能处理“1 5/16" 。这对OP来说可能不是问题,但我提到它的完整性。 –

+0

@BrianMStafford正确。 OP的实施非常天真!我想这只是“完成工作”=) –

+0

@Brian,用例总是一个简单的分数(“分子/分母”)作为字符串。 – NOYB

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 
+0

利用Excel的计算引擎,所以也会评估'“SUM(A:A)/ SUM(B:B)”'。很可能是解决OP问题的最简单方法。另一方面...它将代码绑定到Excel对象模型。 –

+1

如果Evaluate的评估结果为错误值,会将运行时错误13提升到v; –

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 

该解决方案从微软网站https://support.microsoft.com/en-us/help/185424/how-to-convert-a-fraction-to-a-decimal-number