我有一个包含大约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将起作用。为什么会发生这种情况?如何解决这个问题?
谢谢!
答案 0 :(得分:0)
如果小数点分隔符由于语言环境设置而为逗号,则Double
到String
的隐式转换和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)
- 大于上述听起来很奇怪; - )