如果我谷歌“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 位的整数?