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