2017-06-06 48 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