VBA 带有可变十进制参数的 CountIfs returns 零
VBA CountIfs with variable decimal argument returns zero
我正在尝试编写一个代码来搜索范围 C1:C88211
并计算使用 countifs
在 i
和 m
之间找到值的次数。所有值都在 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 值而不是零。
当我更改我的设置以使用“,”作为小数点分隔符时,我仍然得到上面显示的值。
我尝试了多种不同的系统分隔符组合,还尝试了使用 Str
或 Cstr
找到 的修复程序,但它总是 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)
我正在尝试编写一个代码来搜索范围 C1:C88211
并计算使用 countifs
在 i
和 m
之间找到值的次数。所有值都在 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 值而不是零。 当我更改我的设置以使用“,”作为小数点分隔符时,我仍然得到上面显示的值。
我尝试了多种不同的系统分隔符组合,还尝试了使用 Str
或 Cstr
找到
我试过你的代码,对我来说它有效;但是我稍微改变了它...... 我在代码中添加了一个 运行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)