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
依賴的工作表可能與當前工作表不同。
所以,不應該使用Evaluate
,Evaluate
更偏向於將儲存格中的文字轉成程式碼用的。
解決方法:將 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 |
快速對照表
類型 | 推薦函數 |
---|---|
整數 | CInt 、CLng |
浮點數 | CDbl 、CSng |
文字 | CStr |
日期時間 | CDate 、DateValue 、TimeValue |
布林值 | CBool |
自訂錯誤 | CVErr |