Wenn Sie höher gehen wollen als 2^31 Sie Decimal
oder LongLong
nutzen könnten. LongLong
und CLngLng
funktionieren jedoch nur auf 64-Bit-Plattformen. Da ich zur Zeit nur 32 Bit Office habe, ist dies für Decimal
und CDec
.
Es scheint ein Problem bei der Konvertierung von 8-stelligen Hex-Zahlen zu geben, da offensichtlich signierte 32-Bit irgendwo im Prozess verwendet wird, was zu dem Zeichenfehler führt, obwohl Decimal
die Zahl verarbeiten kann.
'only for positive numbers
Function myHex2Dec(hexString As String) As Variant
'cut off "&h" if present
If Left(hexString, 2) = "&h" Or Left(hexString, 2) = "&H" Then hexString = Mid(hexString, 3)
'cut off leading zeros
While Left(hexString, 1) = "0"
hexString = Mid(hexString, 2)
Wend
myHex2Dec = CDec("&h" & hexString)
'correct value for 8 digits onle
If myHex2Dec < 0 And Len(hexString) = 8 Then
myHex2Dec = CDec("&h1" & hexString) - 4294967296#
'cause overflow for 16 digits
ElseIf myHex2Dec < 0 Then
Error (6) 'overflow
End If
End Function
Test:
Sub test()
Dim v As Variant
v = CDec("&H80000000") '-2147483648
v = myHex2Dec("&H80000000") '2147483648
v = CDec("&H7FFFFFFFFFFFFFFF") '9223372036854775807
v = myHex2Dec("&H7FFFFFFFFFFFFFFF") '9223372036854775807
v = CDec("&H8000000000000000") '-9223372036854775808
v = myHex2Dec("&H8000000000000000") 'overflow
End Sub
VBA nicht über unsigne -
Decimal
kann bis zu 16^12 für Werte verwendet werden, d ganze Zahlen, nur _Long_ und _Integer_, beide signiert. – Gustav... und das ist die größte positive Ganzzahl, die 32-Bit-VBA weiß: '? CLng ("& h7FFFFFFF") 2147483647' – Andre
Es ist merkwürdig, dass Sie mit 'Decimal' höher gehen können, aber die Konvertierung verwendet 32-Bit, wenn Ihr Hex 32 8 Ziffern oder kürzer ist. Wenn Sie 'CDec' mit einem 9-stelligen Hex verwenden, funktioniert es. – arcadeprecinct