带有可变小数参数的VBA CountIfs返回零

时间:2015-08-06 09:28:52

标签: excel-vba for-loop countif vba excel

我正在尝试编写一个搜索范围C1:C88211的代码,并计算使用imcountifs之间查找值的次数。 Al值介于1和3之间,我希望使用for循环计算0.05的步长,在每次新运行时将标准加0.05。我为此制作了一个宏,它的步骤为1,但不是十进制步。

 Dim i As Single
Dim m As Single
Dim k As Long
Dim rws As Long
Dim rng As Range
ThisWorkbook.Worksheets("blad4").Activate

rws = Cells(Worksheets("blad4").rows.Count, 3).End(xlUp).Row
Set rng = ThisWorkbook.Worksheets("blad4").Range(Cells(1, 3), Cells(rws, 3))

k = 1
For i = 0 To 3 Step 1
    m = i + 1
    Cells(k, 6) = Application.WorksheetFunction.CountIfs(rng, ">=" & i, rng, "<" & m)
    Cells(k, 7) = i
    Cells(k, 8) = m
k = k + 1

Next i

当运行上述内容时,下面的内容放在工作表上:

75168   0.00    1.00
6131    1.00    2.00
1681    2.00    3.00

0到1之间的75168个数据点, 6131介于1和2等之间......

但是,当stepize更改为包含小数的任何内容时,如下所示,它只返回零。

k = 1
For i = 0 To 2 Step 0.05
    m = i + 0.05
    Cells(k, 6) = Application.WorksheetFunction.CountIfs(rng, ">=" & i, rng, "<" & m)
    Cells(k, 7) = i
    Cells(k, 8) = m
k = k + 1

我认为它可能与变量的类型,单一,我正在使用或只是错误的格式,缺少括号等有关。

非常感谢帮助。

数据和excel版本都有&#34;。&#34;作为十进制分隔符,所以我不认为这是问题所在。 (虽然系统使用逗号作为小数分隔符)

UPDATE ---------------------------------------------- ----------------------------

代码可能是正确的,所以我更多地查看了我的工作表并尝试了一些更改。首先,这是前5行的结果。我在不使用VBA的情况下获得了这个结果,(我需要生成的图形数量不是一个选项。)

0     0.05  32487
0.05  0.1   6662
0.1   0.15  5276
0.15  0.2   4854
0.2   0.25  3886

在excel选项/高级中,框&#34;使用系统分隔符未选中,并作为十进制分隔符a&#34;。&#34;被用作千万分隔符&#34;,&#34;使用。

现在为有趣的部分。当我选择我的数据范围,并替换所有&#34;。&#34;用逗号。当我现在运行代码时,结果如下:

0     0.05  0
0.05  0.1   111
0.1   0.15  108
0.15  0.2   39
0.2   0.25  38

显然,这是不正确的,然而它确实返回值而不是零。 当我更改我的设置以制作&#34;,&#34;十进制分隔符我仍然得到上面显示的值。

我尝试了多种不同的系统分隔符组合,并尝试使用StrCstr找到here修复程序,但它始终返回零或上面显示的值。

2 个答案:

答案 0 :(得分:0)

我尝试了你的代码,对我来说它有用;但是我稍微改了一下...... 我在代码中添加了一个范围引用。

Sub TestForStepDecimal()

    Dim i As Single
    Dim m As Single
    Dim k As Long: k = 20
    Dim SrcRange As Range: Set SrcRange = Range("$F13:$M13")

    For i = 0 To 2 Step 0.25
        m = i + 0.25
        Cells(k, 1) = Application.WorksheetFunction.CountIfs(SrcRange, ">=" & i, SrcRange, "<" & m)
        Cells(k, 2) = i
        Cells(k, 3) = m
    k = k + 1

    Next i

End Sub

结果;我不认为这部分代码有任何问题;所以仔细看,我注意到你有一个错字。

Dim rows As Long

然而,“rws”然后在范围内被引用而计算不是“行” - 它可能与此有关。

**** 更新 ****

采用您的新代码 - 我做了一些进一步的小改动...... 当我运行代码时 - 我注意到使用类型Single会产生一些舍入错误 - 这些错误已更新为Double。

以下为我工作......

Sub TestForStepDecimal2()
    Dim i As Double
    Dim m As Double
    Dim k As Long: k = 1
    Dim rws As Long
    Dim rng As Range

    With ThisWorkbook.Worksheets("blad4")
        rws = .Cells(.Rows.Count, 3).End(xlUp).Row
        Set rng = .Range(Cells(1, 3), Cells(rws, 3))

        For i = 0 To 2 Step 0.05
            m = i + 0.05
            .Cells(k, 6) = Application.WorksheetFunction.CountIfs(rng, ">=" & i, rng, "<" & m)
            .Cells(k, 7) = i
            .Cells(k, 8) = m
            k = k + 1
        Next i
    End With
End Sub

答案 1 :(得分:0)

我没有成功让countifs正常工作。我觉得这是由于在我的excel,vba和我的操作系统中使用十进制分隔符不同,我遇到了更多这方面的问题。

最后我用频率来完成同样的事情。 FrRange是包含数据的范围。 BnRange是包含0到3的区间的区间,步长为0.05

Set FrRange = Ws4.Range(Cells(2, 2), Cells(rws, 2))
Set BnRange = Ws4.Range(Cells(2, 1), Cells(Lastbin, 1))
Range(Cells(k, 3), Cells(Lastbin, 3)).FormulaArray = WorksheetFunction_
    .frequency(FrRange, BnRange)