Excel:将非连续单元格数组中的N个最大数相加
我的Excel不是很流利,所以我的问题可能很简单,但还是让我头疼 我有一个带有两种类型值的speadsheet。一个绝对值,另一个以该绝对值的百分比计算Excel:将非连续单元格数组中的N个最大数相加,excel,vba,Excel,Vba,我的Excel不是很流利,所以我的问题可能很简单,但还是让我头疼 我有一个带有两种类型值的speadsheet。一个绝对值,另一个以该绝对值的百分比计算 A 1 10 2 0.1 3 20 4 0.2 5 30 6 0.3 7 40 8 0.4 9 50 10 0.5 在本例中,第二个值是第一个值的1%(例如,10的0.1)。在我的实际表格中,这些值不同,数字是随机的。第二个值的%分数取决于某个键等。因此,这是一个简化的表示形
A
1 10
2 0.1
3 20
4 0.2
5 30
6 0.3
7 40
8 0.4
9 50
10 0.5
在本例中,第二个值是第一个值的1%(例如,10的0.1)。在我的实际表格中,这些值不同,数字是随机的。第二个值的%分数取决于某个键等。因此,这是一个简化的表示形式,仅举一个简单的示例
我想确定最大的4个(5个中的4个)数字的总和,但只能从这些1%(例如0.1,而不是10)的值中确定。这些数字都低于对方。基本上,我想忽略绝对数(如10),只应用相对数(如0.1)
大函数确定最大的n个数字,并具有以下格式:
=SUM(LARGE(array, k))
数组表示表中的连续范围。但是,我需要输入一组选定的字段。有没有一种方法可以通过一组单元格来实现这一点
换句话说,如果我使用我拥有的数组
=SUM(LARGE(A1:A10, {1,2,3,4}))
算法将始终选择20、30、40和50
理想情况下,我想要这样的东西:
=SUM(LARGE(array(A2,A4,A6,A8,A10), {1,2,3,4}))
帮助?对于简化的示例,假设B1:B4包含值1,2,3,4。然后在C1:C4中输入数组公式:
{=LARGE(IF(MOD(ROW(A1:A10),2)=0,A1:A10,-1),B1:B4)}
同样,公式
{=SUM(LARGE(IF(MOD(ROW(A1:A10),2)=0,A1:A10,-1),B1:B4))}
=SUM(LARGE(D1:D5,{1,2,3,4}))
(使用Ctrl+Shift+Enter
接受作为数组公式)
我会给你前4名的总和
这假设所有数字都是正数。如果该假设无效,可以将公式中的-1
替换为所有值-1的最小值
另一种方法是,如果作为相对单元格的标准过于特殊,无法用简单的公式进行总结,但如果有单元格列表,则使用间接
函数:
在上面的屏幕截图中,我有一个包含相对值的单元格列表。在D1
中,我将公式=间接(C1)
复制下来。然后,公式
{=SUM(LARGE(IF(MOD(ROW(A1:A10),2)=0,A1:A10,-1),B1:B4))}
=SUM(LARGE(D1:D5,{1,2,3,4}))
返回所需的总和
也许有一种方法可以省去helper列,尽管函数INDIRECT
似乎不能很好地处理数组公式
编辑时:以下是VBA解决方案:
'The following function returns the sum of the largest k
'elements in range R that are at the list of indices
'if indices is left blank, then the sum of
'the largest k in R is returned
Function SumLargest(R As Range, k As Long, ParamArray indices() As Variant) As Double
Dim A As Variant
Dim i As Long, n As Long
Dim sum As Double
n = UBound(indices)
If n = -1 Then
For i = 1 To k
sum = sum + Application.WorksheetFunction.Large(R, i)
Next i
SumLargest = sum
Exit Function
Else
ReDim A(0 To n)
For i = 0 To n
A(i) = R.Cells(indices(i)).Value
Next i
For i = 1 To k
sum = sum + Application.WorksheetFunction.Large(A, i)
Next i
SumLargest = sum
End If
End Function
如果将此函数放在标准代码模块中,则可以从工作表中使用它,如:
=SumLargest(A1:A10,4,2,4,6,8,10)
最后一个返回最大4的总和,使用您提供的样本数据从2,4,6,8,10处的条目中提取,类似于此常规公式(不需要数组条目)的内容应该适用于您,因为百分比始终小于或等于1:
=SUMPRODUCT(LARGE((A1:A10<=1)*A1:A10,{1,2,3,4}))
编辑:如果获取相对值的唯一方法是每隔一行,从第2行开始,则可以使用以下公式:
=SUMPRODUCT(LARGE(INDEX((MOD(ROW(A1:A10),2)=0)*A1:A10,),ROW(1:4)))
当且仅当数字低于1.0时,数字是否相对?否,仅在此简化示例中。没有办法确定一个数字是rel还是abs,但我知道的是它的单元格位置。换句话说,我有一个我知道我要包含的单元格列表。所以其他每个数字都是相对的?好吧,让我们不要太关注绝对数或相对数。我有几组数字,其中一个比另一个大(例如80和0.5,或50和1.6)。第二个数字不需要小于1(这不是概率),它只是更小。我想做的就是找到一种方法,将大数组作为一个非连续的范围输入,例如,手动列出6或7个字段,而不是一个范围。如果您想手动列出字段,那么我给出的第二个使用间接函数的解决方案应该可以工作。内置数组公式似乎不适用于非连续范围。VBA解决方案将是相当自然的
索引(X*A1:A10,)
做了什么来实现这一点?@JerryJeremiah它允许MOD
函数作为数组计算,而不是只返回第一个结果,它将为MOD
函数提供的范围内的每个单元格计算它