确定活动的值。 cell.value

时间:2015-07-16 18:37:01

标签: uitableview excel-vba vba excel

我正在制作一个简单的支票簿电子表格。当我尝试平衡账簿时,我最后输入第一列中的对账单中的余额。列F包含我的余额转发,第H列包含一个更正数,由尚未返回的所有交易金额组成,而第J列包含在列H和I中添加相关单元格内容的公式,并在F列中减去相关单元格的内容。如果所有内容都已正确输入,则列J中的相关单元格显示为$ 0.00(单元格格式为货币)

我的脚本然后检查是否所有内容都输入正确。它激活J列中的相关单元格,如果ActiveCell.Value = 0'它标记一切正确。在脚本的以下行中,'如果ActiveCell.Value<> 0'脚本检查该值是正还是负,并适当地标记它。

出于某种原因,当我正确输入所有交易时,脚本不会将单元格值(显示为0.00美元)视为= 0.而是将其标记为负值。 / p>

我很困惑。我也在使用Excel 2013和VBA脚本

1 个答案:

答案 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