VBA 带有可变十进制参数的 CountIfs returns 零

VBA CountIfs with variable decimal argument returns zero

我正在尝试编写一个代码来搜索范围 C1:C88211 并计算使用 countifsim 之间找到值的次数。所有值都在 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

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

但是,当步长更改为包含小数的任何内容时,如下所示,return只有零。

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 版本都有一个“.”作为小数分隔符,所以我认为这不是问题所在。 (虽然系统使用逗号作为小数分隔符)

更新----------------------------------------- ------------------------------

代码可能是正确的,所以我仔细查看了我的工作表并尝试了一些更改。首先,这是前 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 options/advanced 中,使用方框 "use system seperators is unchecked and as decimal seperator a "." 作为千位分隔符,使用 ","。

现在是有趣的部分。当我select我的范围内的数据时,把“.”全部换掉了。用逗号。当我 运行 现在的代码时,结果是这样的:

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

显然,这是不正确的,但是它确实 return 值而不是零。 当我更改我的设置以使用“,”作为小数点分隔符时,我仍然得到上面显示的值。

我尝试了多种不同的系统分隔符组合,还尝试了使用 StrCstr 找到 的修复程序,但它总是 return 为零或上面显示的值。

我试过你的代码,对我来说它有效;但是我稍微改变了它...... 我在代码中添加了一个 运行ge 引用。

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' 然后在 运行ge 中被引用并且计算不是 'rows' - 这可能与此有关。

**** 更新 ****

采用你的新代码 - 我做了一些进一步的小改动...... 当我 运行 代码时 - 我注意到使用类型 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

我没有成功让 countifs 正常工作。我觉得这是由于我的 excel、vba 和 os 中小数分隔符的不同使用造成的,我遇到了更多问题。

最后我用频率完成了同样的事情。 FrRange 是包含数据的范围。 BnRange 是包含从 0 到 3 的 bin 的范围,步长为 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)