我正在制作一个简单的支票簿电子表格。当我尝试平衡账簿时,我最后输入第一列中的对账单中的余额。列F包含我的余额转发,第H列包含一个更正数,由尚未返回的所有交易金额组成,而第J列包含在列H和I中添加相关单元格内容的公式,并在F列中减去相关单元格的内容。如果所有内容都已正确输入,则列J中的相关单元格显示为$ 0.00(单元格格式为货币)
我的脚本然后检查是否所有内容都输入正确。它激活J列中的相关单元格,如果ActiveCell.Value = 0'它标记一切正确。在脚本的以下行中,'如果ActiveCell.Value<> 0'脚本检查该值是正还是负,并适当地标记它。
出于某种原因,当我正确输入所有交易时,脚本不会将单元格值(显示为0.00美元)视为= 0.而是将其标记为负值。 / p>
我很困惑。我也在使用Excel 2013和VBA脚本
答案 0 :(得分:1)
您看到的舍入误差太小,无法使用默认精度显示。这是一个简单的例子:
Sub test1()
Dim num As Double, total As Double
Dim i As Long
num = 0.1
For i = 1 To 10
total = total + num
Next i
MsgBox total
total = 1 - total 'should be 0, no?
If total > 0 Then
MsgBox "Negative"
ElseIf total = 0 Then
MsgBox "Balanced"
Else
MsgBox "Positive"
End If
End Sub
"负"弹出。问题是,当在基数2 中写入时,实数0.1 具有重复的十进制扩展(在基数10中类似于2/3),它是四舍五入的(有点像我们如何将2/3舍入到0.666667)因此,计算机使用的数字实际上比大大于0.1,因此它们中的10个总和不是1.0而是更接近1.00000000001,因此当你从1减去它而不是平衡你得到一个小的负数。
有各种解决方案。最简单的方法之一是声明所有包含财务数据的变量Variant
,然后使用CDec
初始化它们。这将它转换为Variant子类型Decimal,它没有相同的问题。 (很遗憾,您无法直接将变量声明为十进制)。例如:
Sub test2()
Dim num As Variant, total As Variant
Dim i As Long
num = CDec(0)
total = CDec(0)
num = 0.1
For i = 1 To 10
total = total + num
Next i
MsgBox total
total = 1 - total 'should be 0, no?
If total > 0 Then
MsgBox "Negative"
ElseIf total = 0 Then
MsgBox "Balanced"
Else
MsgBox "Positive"
End If
End Sub