VBA - 所有excel sum函数都无法正常工作

时间:2016-04-25 18:08:02

标签: excel vba excel-vba

问题是什么?由于一些奇怪的原因,excel无法从范围中正确计算值。

请查看

enter image description here

呈现范围的正确总和为0,excel表示它总和为1,818989E-12。当我选择次要范围(例如,没有第一个或最后一个单元格)时,它正确地求和,当我改变范围的数字格式时,它总和正确 - 但这些变通方法仅在工作表中起作用 - 当我使用VBA时(实际上这是某些部分的一部分)宏)我仍然得到这个奇怪的数字 - WorksheetFunctionSumSubtotal每个SumIf仍然返回正确的结果,更改范围的数字格式不起作用,也乘以1,所以欢迎任何建议。我还可以说,这只发生在这种特定的情况下 - 可能其余的分析数据都很好(=总和正常工作),这也不是一个变量类型的问题,因为第一个版本的代码没有使用任何变量来标记总和。

这是代码的一部分:

For Each kom In amountRng
    Set baza = Rows("" & prevKom.Offset(1, 0).Row & ":" & kom.Offset(-1, 0).Row & "")
    baza.Copy
    Sheets("roboczy").Activate
    Range("A2").PasteSpecial xlPasteValues

    'multipying by 1 doesn't work
    'Range("A1").End(xlToRight).Offset(0, 1).Select
    'Selection.Value = 1
    'Selection.Copy
    'Range(Range("V2"), Range("V2").End(xlDown)).PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply

    'changing of numberformat doesn't work
    'Columns("V:V").NumberFormat = "0.00"

        If IsEmpty(Range("A3")) Then
            Range("M2").Copy
            Range("A4").PasteSpecial xlPasteValues
        Else:
            Range(Range("M2"), Range("M2").End(xlDown)).Copy
            Range("A2").End(xlDown).Offset(2, 0).PasteSpecial xlPasteValues
        End If
    Selection.RemoveDuplicates 1
    Selection.CurrentRegion.Select

    Dim liczba As Single

    For Each zam In Selection
        Range("A1").CurrentRegion.AutoFilter field:=13, Criteria1:=zam.Value
        Set sumowanieRng = Range(Range("V" & Rows.Count).End(xlUp), Range("V2")).Cells.SpecialCells(xlCellTypeVisible)
        sumowanieRng.EntireRow.Copy
        liczba = WorksheetFunction.Sum(sumowanieRng)
        Debug.Print liczba
            If liczba = 0 Then
                Sheets("zerowe").Activate
                Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
            Else:
                Sheets("niezerowe").Activate
                Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
            End If
        Application.CutCopyMode = False
        Sheets("roboczy").Activate
        If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
    Next

    Range("A" & Rows.Count).End(xlUp).Select
    Range(Range("A2"), Selection).EntireRow.Clear
    Sheets(2).Activate
    Set prevKom = kom
Next

1 个答案:

答案 0 :(得分:0)

如果想要更准确的求和,请使用非浮点数据类型,如十进制

Dim d, c, i

For Each c In Range("B2:B25")
    d = d + CDec(c)
    i = i + CDbl(c)
Next c
Debug.Print d, i

输出

 0             1.81898940354586E-12 

请记住1.81898940354586E-12非常接近0.