Excel VBA / math:计算一组数字中有多少组n

时间:2015-10-28 15:59:19

标签: excel-vba math grouping equation vba

我有一点大脑冻结,我觉得这很简单,但它不会来找我。我需要一个方程来计算可变数据变量范围内的10个组的数量。这是一个小例子,真实的东西有数百个带有变量min和max的数字:

{{1}}

我不想使用数据透视表或组功能,我宁愿将其保留在VBA中。此外,我不想先计算舍入值,然后计算不同的值,因为我想使用数字来标注数组,然后我将在循环中填充。有一个聪明的数学可以给出答案吗?

2 个答案:

答案 0 :(得分:2)

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

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

其中r是数据范围,dec_places是舍入量(因为你四舍五入到最近的10s,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

希望这有帮助

答案 1 :(得分:1)

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

假设您的数据位于A列,并且行数少于1000行,则可以使用:

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

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

它的作用是将每行乘以10从A1到A1000,然后检查在将A1中的每个单元格舍入到A1000时是否可以找到该结果。也就是说,它会检查10,20等,最多为1000,并尝试在舍入值的范围内找到它。每当它找到一个值时,它会将找到的行乘以0,然后加1.每当它找不到值时(即:返回错误),它就会显示0.所有匹配的总和会给出数字每次从10到1000的舍入数字被找到。

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