长数据类型不在Excel VBA中存储长值

时间:2017-10-11 16:37:00

标签: excel vba excel-vba long-integer operator-precedence

当我在excel VBA中执行下面的代码时,第一个消息框正确地返回long值,但是当我将该值存储在long数据类型和messagebox中时,long变量返回0(?!)。

Sub Test()

Dim lFileCount As Long
Dim lAdder As Long

lFileCount = 1

MsgBox 0.35! + (0.15! / lFileCount)

lAdder = 0.35! + (0.15! / lFileCount)
MsgBox lAdder
MsgBox Format(lAdder, "0.0")

End Sub

感叹号的原因是由于项目中的长时间溢出我从中推断出代码。如果我删除它们不会改变结果。我不知道是什么导致这种情况,我首先想到的是它与变量如何根据操作顺序存储有关,但我没有工作解决方案。

我很困惑,任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:4)

  

感叹号的原因是由于项目中的长时间溢出我从中推断出代码。如果我将其删除,则不会更改结果。

阅读你说的话。两次。您不需要这些类型提示。 VBA中的任何浮点字面值都隐式为Double - 通过使用!对其进行类型提示,您可以使它们Single,这会降低其大小和精度。你原本会使用的类型。

通过对VBA data types的一些研究,您会发现Long无法保留浮点值。 Long是一个32位整数,全部是。所以这样做:

Dim lAdder As Long

然后这样做:

MsgBox Format(lAdder, "0.0")

没有意义:任何整数值的小数部分总是为0。

并且0.35 + 0.15始终为0.5,转换为Long也始终为0:

Debug.Print CLng(0.5) 'prints 0

这就是你在这里隐含地做的事情:

lAdder = 0.35! + (0.15! / lFileCount)

您正在使用Double,并将其分配给Long。结果将是Long

声明lAdder As Double,问题解决了。

也就是说,丢弃l前缀。这是Systems Hungarian符号的无用,令人困惑和懊悔,它完全没有任何目的,但却使你的代码膨胀,使一切都比它应该更难阅读。

答案 1 :(得分:1)

长是一个整数。

我将lAdder更改为Variant以收集小数值:

Sub Test()
    Dim lFileCount As Long
    Dim lAdder As Variant
    lFileCount = 1
    MsgBox 0.35 + (0.15 / lFileCount)
    lAdder = 0.35 + (0.15 / lFileCount)
    MsgBox lAdder
    MsgBox Format(lAdder, "0.0")
End Sub

看起来我对As Variant的使用不合适,如本答案的评论所示。由于Double应该用于小数:

 Sub Test()
    Dim lFileCount As Long
    Dim lAdder As Double
    lFileCount = 1
    MsgBox 0.35 + (0.15 / lFileCount)
    lAdder = 0.35 + (0.15 / lFileCount)
    MsgBox lAdder
    MsgBox Format(lAdder, "0.0")
End Sub