在VBA中签署Val函数的结果

时间:2015-09-28 01:35:05

标签: vba

我在ms访问时使用vba,发现,如果我的参数大于0x8000 小于0x10000,结果为负数

例如。 Val(“& H8000”)= - 32768 Val(“& HFFFF”)= -1

我怎样才能得到无符号数? 谢谢!

3 个答案:

答案 0 :(得分:3)

这里有一个问题:

?TypeName(&HFFFF)
Integer

Integer类型是16位,65,535溢出它。这可能有些过分,但写起来很有趣:

Function ConvertHex(ByVal value As String) As Double

    If Left(value, 2) = "&H" Then
        value = Right(value, Len(value) - 2)
    End If

    Dim result As Double

    Dim i As Integer, j As Integer
    For i = Len(value) To 1 Step -1

        Dim digit As String
        digit = Mid$(value, i, 1)

        result = result + (16 ^ j) * Val("&H" & digit)
        j = j + 1

    Next

    ConvertHex = result

End Function

此函数从右侧开始迭代每个数字,计算其值并在移动到最左边的数字时将其添加到结果中。

?ConvertHex("&H10")
 16 
?ConvertHex("&HFF")
 255 
?ConvertHex("&HFFFF")
 65535 
?ConvertHex("&HFFFFFFFFFFFFF")
 281474976710655 

更新

我怀疑,有更好的方法可以做到这一点。 Credits to @Jonbot for this one

Function ConvertHex(ByVal value As String) As Currency
    Dim result As Currency
    result = CCur(value)

    If result < 0 Then
        'Add two times Int32.MaxValue and another 2 for the overflow
        'Because the hex value is apparently parsed as a signed Int64/Int32
        result = result + &H7FFFFFFF + &H7FFFFFFF + 2
    End If

    ConvertHex = result
End Function

答案 1 :(得分:2)

在十六进制文字中附加一个&符号以强制转换为32位整数:

Val("&HFFFF" & "&") == 65535
Val("&H8000&")      == +32768

答案 2 :(得分:2)

请勿使用Val。请改用其中一个内置转换函数:

?CCur("&HFFFF")
 65535

?CDbl("&HFFFF")
 65535

在这种情况下,请Currency优先于Double,以避免出现浮点问题。