当我在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
感叹号的原因是由于项目中的长时间溢出我从中推断出代码。如果我删除它们不会改变结果。我不知道是什么导致这种情况,我首先想到的是它与变量如何根据操作顺序存储有关,但我没有工作解决方案。
我很困惑,任何帮助都会非常感激!
答案 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