Excel VBA / 数学:计算一个数字范围内有多少组 n

Excel VBA / math: count how many groups of n are in a range of numbers

我的大脑有点僵硬,我认为这很简单,但我没有想到。我需要一个方程式来计算可变数据可变范围内 10 组的数量。这是一个小例子,真实的东西有数百个数字,带有变量 min 和 max:

Number      Rounded number to nearest 10
303.9       300
285         290 - min
443         440
446.8       450
461.1       460 - max
428.83      430
428.545     430
445.835     450
427.215     430
429.97      430

Unique groups of 10     
300     
290     
440     
450     
460     
430     

Answer = 6 groups

我不想使用数据透视表或分组函数,我宁愿将其单独保留在 VBA 中。此外,我不想先计算出舍入值,然后计算不同的值,因为我想使用数字来确定数组的维度,然后我将在循环中填充它。有什么聪明的数学可以给出答案吗?

我不知道有什么聪明的数学可以做到这一点。您可以使用工作表公式执行此操作:

=SUM(--(FREQUENCY(ROUND(r,dec_places),ROUND(r,dec_places))>0))

其中 r 是数据范围,dec_places 是四舍五入的数量(因为您要四舍五入到最接近的 10,所以 dec_places = -1)。

您可以在 VBA 中使用类似以下内容的方式实现此功能:

Function CountUniqueRounded(r As Range, dec_places As Double) As Long
    ' Implement this worksheet formula
    '    =SUM(--(FREQUENCY(ROUND(r,dec_places),ROUND(r,dec_places))>0))
    Dim rAddr As String
    Dim rFormula As String
    Dim c As Long

    ' Build up the formula string
    rAddr = r.Parent.Name & "!" & r.Address
    rFormula = "ROUND(" & rAddr & "," & CStr(dec_places) & ")"
    rFormula = "=SUM(--(FREQUENCY(" & rFormula & "," & rFormula & ")>0))"
    ' Debug.Print rFormula
    c = Application.Evaluate(rFormula)
    CountUniqueRounded = c
End Function

希望对您有所帮助

我有一个不需要 VBA 的数组公式解决方案。数组公式采用通常仅适用于单个单元格的单个函数,并在一系列单元格上执行该函数,返回不同结果的数组(每个单元格 1 个)。然后将结果数组折叠成一个数字来给出您的答案。

假设您的数据在 A 列中,并且少于 1000 行,这将有效:

=SUM(IFERROR(MATCH(10*(ROW(A1:A1000)),ROUND(A1:A1000,-1),0)*0+1,0))

请注意,要确认数组公式,您需要按 CTRL + SHIFT + ENTER,而不是直接按 ENTER。

它所做的是将 A1 到 A1000 的每一行乘以 10,然后在将 A1 到 A1000 中的每个单元格四舍五入时检查是否可以找到该结果。也就是说,它检查 10、20 等直到 1000,并尝试在您的舍入值范围内找到它。每当它找到一个值时,它将找到的行乘以 0,然后加 1。每当它找不到值(即:returns 错误)时,它显示 0。所有匹配项的总和为您提供从 10 到 1000 的每个四舍五入的数字被找到的次数。

警告 - 如果您的数字大于 1000,这将不起作用;如果出现这样的数字,您可以轻松地将 1,000 的所有实例更改为 10,000。同样,如果您的数据有时超出第 1000 行,您将需要将 1000 的所有实例增加到适当的数量。如果数据变化很大并且您无法估计大小/最大限制,那么有一些方法可以自动执行此操作,但由于公式已经有些复杂,我将其保留为手动过程。