VBA-Excel 为什么长数据类型在 64 位之前溢出?

问题描述 投票:0回答:1

如果我谷歌“VBA long”,它告诉我 long 可以存储最多 2^63 - 1 的数字。但是我收到高于 2^31 - 1 的错误。在下面的代码中,我分离出了我的 3尝试将代表十六进制数字的 0-15 数字数组转换为一个数字。即使我尝试在任何地方使用长数据类型,我仍然会遇到溢出错误。我能够停下来,在 Wolfram alpha 中自己进行数学计算,并验证它们没有超过预期的大小。我看到其他一些帖子讨论如果没有指定 long,VBA 如何默认为整数,但我已经指定了 long。

Public Sub test()
    Dim vd As Long
    Dim fact As Long
    vd = 0
    fact = 1
    For i = 0 To 7
        'attempt 1
        vd = vd + fact * Sheet1.Cells(1, 8 - i).Value
        'attempt 2
        Dim temp As Long
        temp = fact * Sheet1.Cells(1, 8 - i).Value
        vd = vd + temp
        'attempt 3
        Dim temp As Long
        temp = fact * CLng(Sheet1.Cells(1, 8 - i).Value)
        vd = vd + temp
        'continue with the rest of the code
        fact = fact * 16
    Next i
End Sub

我确实看到我运行的是 32 位还是 64 位。我运行了下面的代码,它告诉我我正在运行 64 位。

    #If Win64 Then
        MsgBox "You're using 64-bit MSOffice"
    #Else
        MsgBox "You're using 32-bit MSOffice"
    #End If

但我发现另一个消息来源说,如果 Application.Version 中包含 x64,我只是 64 位。但是,当我运行

MsgBox (Application.Version)
时,它打印出 16.0,其中不包含 x64。所以我不知道我有哪些...此外,我看到的所有讨论此问题的资源都无法解释为什么 long 说它可以处理 64 位但在 32 位时溢出。

我的第一次尝试只是使用包含加法和乘法的表达式直接添加到 long 变量。程序就在线上停止了

vd = vd + fact * Sheet1.Cells(1, 8 - i).Value

我的第二次尝试是先进行乘法,然后添加到变量中。程序在

temp = fact * Sheet1.Cells(1, 8 - i).Value
行暂停。在中断时,fact = 268,435,456 (16^7) 并且存储在引用单元格中的值为 10。此乘法的结果 (16^7 * 10) 应该约为2,684,354,560 (2^31.322).

我的第三次尝试是将单元格的内容强制转换为长整型,以便乘法符号的两侧都绝对是硬强制强制转换为长整型,没有任何解释。程序在线上停止了

temp = fact * CLng(Sheet1.Cells(1, 8 - i).Value)
,情况和之前一样

最后(未显示)我将所有相关数据类型更改为 LongLong。这解决了这个问题。但为什么?为什么 long 不能处理超过 32 位的整数?

excel vba types overflow long-integer
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.