HOWTO · VBA
在 VBA 中將字串轉換為數字
本教程演示如何在 VBA 中將字串轉換為數字。
本頁內容
若要將含有數字的文字轉換為 VBA 中的數值,請將文字傳給符合所需數值型別的轉換函式。16 位元整數請使用 CInt,32 位元長整數請使用 CLng;若需要不同的範圍或精度,可使用 CDbl、CCur 或 CDec 等函式。以下範例列出 VBA 呼叫及所提供的 Excel 訊息方塊結果;此頁面的執行環境並未執行範例中的 VBA 程式碼。
在 VBA 中將字串轉換為數字
VBA 提供多種轉換函式,因為整數、浮點數與定點數有不同的範圍和精度。本文介紹的函式包括 CByte、CInt、CLng、CSng、CDbl、CCur 和 CDec。每個函式都會接受 VBA 可解讀為數值的值,並回傳相應的數值型別;例外是 CDec,它會回傳子型別為 Decimal 的 Variant。
請依據資料本身和後續運算選擇合適的結果型別。整數轉換會透過捨入處理小數部分,並非單純移除小數位數。若要以四位小數進行精確的財務運算,通常可使用 Currency。若需要更大的十進位數值範圍和小數位數,可透過 Variant 使用 Decimal 子型別。
選擇適合的 VBA 轉換函式
| 函式 | 結果 | 適用情況 |
|---|---|---|
CByte |
Byte,0 到 255 | 數值是小的非負整數。 |
CInt |
Integer,−32,768 到 32,767 | 有正負號的 16 位元整數範圍足以使用。 |
CLng |
Long,−2,147,483,648 到 2,147,483,647 | 需要較大的有正負號整數範圍。 |
CSng |
Single | 精度較低的近似浮點數已足夠。 |
CDbl |
Double | 需要雙精度浮點數較大的範圍和精度。 |
CCur |
Currency | 需要有四位小數的定點運算,常用於金額。 |
CDec |
Variant 的 Decimal 子型別 | 需要比 Currency 支援更多小數位數的十進位運算。 |
Integer 和 Long 都是整數型別。在 VBA 中,Integer 的範圍為 16 位元,而 Long 使用 32 位元;可能的數值若超出 Integer 範圍,請選用 Long。以 As Long 宣告的變數是 Long;若要保留 CDec 回傳的 Decimal 子型別,變數必須是 Variant。
將字串轉換為整數型別
若結果應為整數,請使用 CByte、CInt 或 CLng。以下完整程序都會宣告字串、進行轉換並顯示結果。請將程序貼到標準的 VBA 模組,並在 Excel 中執行。此頁面的執行環境並未執行這些 VBA 程序;提供的訊息方塊圖片顯示相應結果,下方也以可選取的文字列出結果。
若要取得 Byte 結果,請將以下完整程序貼到標準的 VBA 模組並執行:
Sub ShowByte()
Dim inputText As String
inputText = "12"
MsgBox CByte(inputText)
End Sub
訊息方塊會顯示 12。
訊息方塊顯示 12,也就是 CByte("12") 的結果。
若要轉換為有正負號的整數,請貼上並執行以下完整程序:
Sub ShowInteger()
Dim inputText As String
inputText = "12.5"
MsgBox CInt(inputText)
End Sub
訊息方塊會顯示 12。這是四捨六入五成雙:小數部分正好位於中間值時,結果會取最接近的偶數。依照相同的捨入規則,CInt("13.5") 會得到 14。Integer 的值必須介於 −32,768 和 32,767 之間;超出此範圍時,CInt 會發生溢位。
訊息方塊顯示 CInt("12.5") 得到 12;這個中間值會捨入至最接近的偶數。
若需要較大的整數,請選用 CLng。貼上並執行以下完整程序:
Sub ShowLong()
Dim inputText As String
inputText = "15.7"
MsgBox CLng(inputText)
End Sub
小數部分會捨入至最接近的整數,因此訊息方塊會顯示 16。支援的範圍是 −2,147,483,648 到 2,147,483,647。
訊息方塊顯示 16,也就是 CLng("15.7") 的結果。
將字串轉換為浮點數型別
CSng 會轉換為 Single 精度,而 CDbl 會轉換為 Double 精度。浮點數可表示的範圍遠大於整數型別,但許多十進位小數在二進位浮點表示法中只是近似值。進行涉及這類小數的運算時,請勿依賴完全相等的比較;比較計算結果時,應使用容許誤差。
若要轉換為 Single,請貼上並執行以下完整程序:
Sub ShowSingle()
Dim inputText As String
inputText = "1.3"
MsgBox CSng(inputText)
End Sub
訊息方塊會顯示 1.3。顯示的十進位數字不代表所有內部浮點運算都精確無誤。
訊息方塊顯示 1.3,也就是 CSng("1.3") 的結果。
若 Single 精度不足,或運算需要更大的 Double 範圍,請使用 CDbl。這兩個函式都會回傳近似的二進位浮點值;如果小數位數的處理比浮點數範圍更重要,請改用 CCur 或 CDec。若要在 Excel 中查看 Double 結果,請貼上並執行以下完整程序:
Sub ShowDouble()
Dim inputText As String
inputText = "123.45"
MsgBox CDbl(inputText)
End Sub
顯示的數字格式可能會因地區設定而異。
將字串轉換為 Currency 和 Decimal
CCur 會回傳 Currency 值;這是一種定點型別,小數點後有四位數。其範圍是 −922,337,203,685,477.5808 到 922,337,203,685,477.5807。若許多金額運算適合使用固定四位小數,Currency 就很實用。需要超過四位小數的值會捨入至四位小數。若要顯示 Currency 轉換結果,請貼上並執行以下完整程序:
Sub ShowCurrency()
Dim inputText As String
inputText = "12.34"
MsgBox CCur(inputText)
End Sub
CDec 會回傳子型別為 Decimal 的 Variant;VBA 不提供 Decimal 作為獨立的變數宣告型別。Decimal 最多支援 28 位小數,數值上限約為 ±7.9228 × 10^28;可用的小數位數會依數值大小而有所不同。若後續運算需要保留 Decimal 精度,請將結果存放在 Variant 中。以下程序會先將轉換結果指派給 Variant,再顯示結果:
Sub ShowDecimal()
Dim inputText As String
Dim result As Variant
inputText = "12.3456"
result = CDec(inputText)
MsgBox result
End Sub
了解捨入、地區設定和轉換錯誤
VBA 的轉換函式會依照電腦的地區設定解讀數字文字,包括小數分隔符號和千位分隔符號。在某個系統上以逗號作為小數分隔符號的字串,換到另一個系統時,解析結果可能與預期不同。若輸入來自檔案、API,或使用者提供的已知格式,請先正規化或驗證格式,再進行轉換;不要假設每台電腦都使用相同的分隔符號。
若讀者預期所有中間值都會向上捨入,四捨六入五成雙可能令人意外。Python 內建的 round 在這個範例中遵循相同規則;這是用來示範捨入概念的例子,並非執行 VBA。
執行以下 Python 捨入示範:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
print(round(12.5))
12
非數字字串會造成型別不符;數值若超出目標型別的範圍,則會造成溢位。請先檢查使用者輸入,並在轉換呼叫附近處理轉換錯誤,讓應用程式能指出哪個值需要修正。通過數字檢查不代表數值一定符合 Byte、Integer 或 Long 的範圍;指派給較小範圍的型別之前,仍須驗證範圍。