Excel VBA-Evaluate

Evaluate (也就是 js 裡面的 eval ) 可以在 VBA 中將字串轉型別

ex. a = Evaluate(“1”) 相當於 a = 1

但是Evaluate 的作用範圍(scope) 有可能跟想像中不一樣

我在開發一個計算工具時,原本使用了不少 Evaluate 來做為字串轉型成Double 的方法

程式片段:

Do Until lM = ubM - 1 Or (Evaluate(m) >= Evaluate(arM(lM)) And Evaluate(m) < Evaluate(arM(lM + 1)))

開發階段測試都可以正常運作,直到為了方便使用,添加了一個按鈕在頁面上觸發,開始會顯示 “物件不支援此屬性或方法 (錯誤 438)”

錯誤發生在上面寫這行

經過研究發現問題出在Evaluate 並不是單純的將字串轉型,需要考慮上下文關係

Evaluate(m) 會嘗試將 m 解釋為一個 Excel 表達式,如果 m 是純數值或字串,可能無法正確執行。

另外,當按鈕觸發巨集時,巨集執行的上下文可能與直接執行不同,Evaluate 依賴的工作表可能與當前工作表不同。

所以,不應該使用EvaluateEvaluate更偏向於將儲存格中的文字轉成程式碼用的。

解決方法:將 Evaluate 改成 CDbl (Change Double)

改成這樣:

Do Until lM = ubM - 1 Or (CDbl(m) >= CDbl(arM(lM)) And CDbl(m) < CDbl(arM(lM + 1)))

即可解決此問題

相關功能:

函數功能範例
CInt將值轉換為整數(四捨五入到最接近的整數)CInt(5.7)6
CLng將值轉換為長整數(Long)CLng(123456789.5)123456790
CDbl將值轉換為雙精度浮點數(Double)CDbl("3.14159")3.14159
CSng將值轉換為單精度浮點數(Single)CSng(3.14159)3.14159
CDec將值轉換為十進制數字(Decimal,罕用)CDec(12345.6789)12345.6789
CStr將值轉換為字串CStr(123.45)"123.45"
Str將數字轉換為字串(數字前有空白表示正負號)#比較不好用Str(123.45)" 123.45"
CDate將值轉換為日期CDate("2024-12-26")#2024-12-26#
DateValue將字串轉換為日期(僅日期部分)DateValue("2024-12-26")#2024-12-26#
TimeValue將字串轉換為時間(僅時間部分)TimeValue("14:30:00")#14:30:00#
CBool將值轉換為布林值(True 或 False)CBool(1)True
CBool(0)False
VarType獲取變數的類型(返回一個整數型代碼)VarType(123.45)5 (Double)
CVErr將數值轉換為自定義錯誤類型(Variant)CVErr(513)#N/A

快速對照表

類型推薦函數
整數CIntCLng
浮點數CDblCSng
文字CStr
日期時間CDateDateValueTimeValue
布林值CBool
自訂錯誤CVErr

發佈留言