Visual Basic for Applications 只支援帶正負號的 2 及 4 位元組整數,而其他語言 (如
C) 則是帶正負號及不帶正負號的整數兩者都能支援。本文會介紹在帶正負號及不帶正負號 4 位元整數間及帶正負號及不帶正負號 2 位元整數間的轉換函式。
在 VBA 中,整數值的範圍從 -32768 到 +32767,而 Long 值的範圍從 -2147483648 到
2147483647。進行 API 呼叫或呼叫以 C 撰寫的 DLL 時,可能會要求您傳入或接收範圍從 0 到 65535 或 0 到 4294967296
的不帶正負號值。下面提供的轉換函式可將不帶正負號的整數轉換為 Long,也可因為輸入及顯示或其他計算的目的從不帶整負號的 Long 轉換為 Double。
四種函式為:
UnsignedToLong
LongToUnsigned
UnsignedToInteger
IntegerToUnsigned
UnsignedToLong
此函式會使用包含在不帶正負號 Long 範圍內之值的 Double,並傳回 Long,讓您傳到需要不帶正負號 Long 的
API。
LongToUnsigned
此函式會使用來自 API 的不帶正負號 Long,並將其轉換為 Double 以顯示或計算。
UnsignedToInteger
此函式會使用包含在不帶正負號整數範圍內之值的 Long,並傳回整數,讓您傳到需要不帶正負號整數的 API。
IntegerToUnsigned
此函式會使用來自 API 的不帶正負號整數,並將其轉換為 Long 以顯示或計算。
Declare Function MyAPI Lib "xxx" (Value As Long) As Long
Dim uResult As Long
uResult = MyAPI(UnsignedToLong(3300000000))
Debug.Print "Return Code: " & LongToUnsigned(uResult)
在上述範例中,MyAPI API 會接受不帶正負號的 Long 做為參數,並傳回不帶正負號的 Long 做為結果程式碼。因為 VBA
只瞭解帶正負號的 Long,所以 DECLARE 陳述式會使用帶正負號的 Long。UnsignedToLong
function converts a number outside the range of signed Long (but within the
函數會將帶正負號 Long 範圍外 (但在未帶正負號 Long 的範圍內) 的數字轉換為帶正負號的 Long 以呼叫
API。LongToUnsigned 函式則會執行相反的轉換。
如果不使用這些函式,可能會將輸入引數指定為帶正負號的 Long (此案例為
-994967296),且會將傳回值顯示為帶正負號的值,該值也可能是負數且不易瞭解。
逐步範例
- 建立新的 VBA 專案。
- 將下列程式碼加入模組中:
Option Explicit
Private Const OFFSET_4 = 4294967296#
Private Const MAXINT_4 = 2147483647
Private Const OFFSET_2 = 65536
Private Const MAXINT_2 = 32767
Function UnsignedToLong(Value As Double) As Long
If Value < 0 Or Value >= OFFSET_4 Then Error 6 ' Overflow
If Value <= MAXINT_4 Then
UnsignedToLong = Value
Else
UnsignedToLong = Value - OFFSET_4
End If
End Function
Function LongToUnsigned(Value As Long) As Double
If Value < 0 Then
LongToUnsigned = Value + OFFSET_4
Else
LongToUnsigned = Value
End If
End Function
Function UnsignedToInteger(Value As Long) As Integer
If Value < 0 Or Value >= OFFSET_2 Then Error 6 ' Overflow
If Value <= MAXINT_2 Then
UnsignedToInteger = Value
Else
UnsignedToInteger = Value - OFFSET_2
End If
End Function
Function IntegerToUnsigned(Value As Integer) As Long
If Value < 0 Then
IntegerToUnsigned = Value + OFFSET_2
Else
IntegerToUnsigned = Value
End If
End Function
- 僅適用 Visual Basic:執行專案後暫停專案。
- 在 [即時運算/偵錯] 視窗中輸入下列:
?UnsignedToLong(3300000000)
?LongToUnsigned(-55)
?UnsignedToInteger(45000)
?IntegerToUnsigned(-3000) - 您會得到下列結果:
-994967296
4294967241
-20536
62536
如需詳細資訊,請參閱「Microsoft 知識庫」中的下列文件:
112673?
(http://support.microsoft.com/kb/112673/
)
How To Pass & Return Unsigned Integers to DLLs from VB