CountIfs不使用小数

时间:2015-04-19 23:16:05

标签: excel vba

我有一个包含大约7000行数据的工作表,我想使用CountIfs进行分析。数据由十进制数组成,例如“0,05234234”(由于国家/地区设置,小数“点”是逗号)。我的CountIfs代码如下所示:

    For i = 1 To 6
        lastRow = w3.Worksheets(i).Cells(w3.Worksheets(i).Rows.count, 1).End(xlUp).Row
        For j = 1 To n
            tmpRow = 2
            Set rng = w3.Worksheets(i).Range(w3.Worksheets(i).Cells(2, 1 + j), w3.Worksheets(i).Cells(lastRow, 1 + j))
            Do While w1.Worksheets(i).Cells(tmpRow, 1) <> ""
                If tmpRow = 2 Then
                    above = CDbl(-100) 'first element
                Else
                    above = w1.Worksheets(i).Cells(tmpRow - 1, 1)
                End If
                curr = w1.Worksheets(i).Cells(tmpRow, 1)
                ccount = Application.WorksheetFunction.CountIfs(rng, ">" & above, rng, "<=" & curr)
                w1.Worksheets(i).Cells(tmpRow, 1 + j) = ccount
                tmpRow = tmpRow + 1
            Loop
            above = w1.Worksheets(i).Cells(tmpRow - 1, 1)
            w1.Worksheets(i).Cells(tmpRow, 1 + j) = Application.WorksheetFunction.CountIf(rng, ">" & above)
            tmpRow = tmpRow + 1
        Next j
    Next i

“above”和“curr”的值均匀分布,如-2,-1,99,..,0,..,1,99,2。

然而,它不起作用,这让我发疯。每次迭代时,“ccount”的值为0,除了循环后的最后一次。对于那个,“above”等于2,一个整数。事实证明,如果“above”和“curr”是整数,则CountIfs将起作用。为什么会发生这种情况?如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果小数点分隔符由于语言环境设置而为逗号,则DoubleString的隐式转换和CStr的显式转换会导致String以逗号为小数分隔符。但这对于WorksheetFunction.CountIfs来说并不正确。需要小数点。

因此我们必须在此处使用Str进行转换。这将转换为带小数点的String

如何测试此行为:

Sub test()

 Dim above As Double

 above = 1.23

 'Excel's decimal separator is comma due to the locale settings!

 s = "<" & above ' "<1,23" - implicit conversion Double to String
 Debug.Print s

 s = "<" & CStr(above) ' "<1,23" - explicit conversion with CStr
 Debug.Print s

 s = "<" & Str(above) ' "< 1.23" - explicit conversion with Str
 Debug.Print s

End Sub

但你的逻辑是否正确? ...CountIfs(rng, ">" & above, rng, "<=" & curr) - 大于上述听起来很奇怪; - )