【问题标题】:Excel VBA / math: count how many groups of n are in a range of numbersExcel VBA /数学:计算一个数字范围内有多少组n
【发布时间】:2015-10-28 15:59:18
【问题描述】:

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

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 中。此外,我不想先计算出舍入值,然后计算不同的值,因为我想使用该数字来确定数组的尺寸,然后将其填充到循环中。有没有什么聪明的数学能给出答案?

【问题讨论】:

    标签: excel math grouping equation vba


    【解决方案1】:

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

    =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
    

    希望对你有帮助

    【讨论】:

    • 像魅力一样工作,谢谢。另外,我不知道 application.evaluate 所以这是一个奖励:)
    【解决方案2】:

    我有一个不需要 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。每当它没有找到值(即:返回错误)时,它显示 0。所有匹配项的总和为您提供数字从 10 到 1000 的每个四舍五入的数字被找到的次数。

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

    【讨论】:

    • 很好的解释和工具包的一个,谢谢。据我所知,没有办法直接在 VBA 中使用数组公式而不将其设置为单元格公式?
    • 我从来没有做过,但我知道你可以 - 在这里查看初学者:stackoverflow.com/q/24630187/5090027
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多