如何將字符串分數轉換爲數字值?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