我正在尝试编写一个搜索范围C1:C88211
的代码,并计算使用i
在m
和countifs
之间查找值的次数。 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;十进制分隔符我仍然得到上面显示的值。
我尝试了多种不同的系统分隔符组合,并尝试使用Str
或Cstr
找到here修复程序,但它始终返回零或上面显示的值。
答案 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)