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 的所有实例增加到适当的数量。如果数据变化很大并且您无法估计大小/最大限制,那么有一些方法可以自动执行此操作,但由于公式已经有些复杂,我将其保留为手动过程。
我的大脑有点僵硬,我认为这很简单,但我没有想到。我需要一个方程式来计算可变数据可变范围内 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 的所有实例增加到适当的数量。如果数据变化很大并且您无法估计大小/最大限制,那么有一些方法可以自动执行此操作,但由于公式已经有些复杂,我将其保留为手动过程。