长数据types不在Excel VBA中存储长期值

当我在Excel VBA中执行下面的代码时,第一个消息框会正确返回long值,但是当我将该值存储在长数据types和消息框中时,longvariables返回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 

感叹号的原因是由于项目中的漫长的溢出,我从中推导出了代码。 如果我删除它不会改变结果。 我不知道可能是什么原因造成的,我首先想到的是这个variables是如何按照操作顺序存储的,但是我没有任何解决方法。

我很困惑,任何帮助将不胜感激!

长是一个整数。

我将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 

看起来像我作为变种的用法是不合适的,如在这个答案的评论中所示。 由于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 

感叹号的原因是由于项目中的漫长的溢出,我从中推导出了代码。 如果我删除它不会改变结果。

阅读你所说的话。 两次。 你不需要这些types的提示 。 VBA中的任何浮点文字都隐式地是一个Double – bytypes – 用一个! ,你使他们Single ,这将减less您将使用的types的大小和精度。

通过对VBA数据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前缀。 匈牙利语符号无用,令人困惑,而且没有任何意义,但却使您的代码变得更加繁琐,使得所有的事情都变得比原来更难读懂。