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。

Microsoft Excel 訊息方塊顯示將字串 “12” 傳給 CByte 轉換後得到 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 會發生溢位。

Microsoft Excel 訊息方塊顯示將字串 “12.5” 傳給 CInt 轉換後得到 12

訊息方塊顯示 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。

Microsoft Excel 訊息方塊顯示將字串 “15.7” 傳給 CLng 轉換後得到 16

訊息方塊顯示 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。顯示的十進位數字不代表所有內部浮點運算都精確無誤。

Microsoft Excel 訊息方塊顯示將字串 “1.3” 傳給 CSng 轉換後得到 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 的範圍;指派給較小範圍的型別之前,仍須驗證範圍。