VBE立即窗口如何处理文字数字?

时间:2015-04-10 15:46:54

标签: vba vbe

使用立即窗口进行一些调试,我遇到了以下为此问题而简化的以下内容:

运行此命令:

?20000*2

产生“溢出”错误。我们假设这是因为我们没有声明数据类型,并且VBE假设Integer - 结果超出了有符号整数的边界,因此发生了溢出。

但是,如果我跑:

?39999+1

我按预期得到40000

这是因为我最初是以Long而不是Integer(即20,000与39,999)开始的吗?因此,根据初始输入数据而不是计算结果来分配存储器?

2 个答案:

答案 0 :(得分:6)

那是对的。 VBA将采用最大的输入组件并为结果分配内存。由于第一个例子中的两个组件都是Int,所以你得到的就是。

您可以使用类型声明字符强制VBE将数字视为特定数据类型

?20000&*2
 40000 
?20000*2&
 40000 

在这两个例子中,& (长类型声明字符)强制将内存分配为Long。它是第一个组件还是后一个组件并不重要。我认为有些操作会被强制转换为特定的数据类型。指数就是其中之一。

?2^2^2^2^2^2
 4294967296 
?typename(2^2^2^2^2^2)
Double

即使所有组件都是整数,结果也是双倍的 - 即使它不是必须

?typename(2^2)
Double

答案 1 :(得分:5)

此隐式输入不仅限于立即窗口。您的代码中可能会出现相同的溢出:

Sub foo()

  Dim x As Long

  x = 20000 * 2 'Overflow error

End Sub

此外,当String隐式转换为数字类型时,它会被转换为Double

?TypeName("123" + 6)
Double