Excel:在非连续的单元格arrays中总计N个最大的数字

我不是那么stream利的Excel,所以我的问题可能非常简单,但却让我头痛。

我有一个有两种types值的电子表格。 一个绝对值,一个以绝对值作为百分比计算的值。

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个)数字的总和,但是只能从那些1%(例如0.1,而不是10)的数值中确定。 这些数字都低于对方。 基本上,我想忽略的绝对数字(例如10),只适用相对(如0.1)的数字。

LARGE函数确定最大的n个数字,并具有以下格式:

 =SUM(LARGE(array, k)) 

该数组表示表中的连续范围。 但是,我需要抛出一组选定的字段。 有没有办法做到这一点的单元格?

换句话说,如果我使用我有的数组

 =SUM(LARGE(A1:A10, {1,2,3,4})) 

algorithm将总是select20,30,40和50。

理想情况下,我想要这样的东西:

 =SUM(LARGE(array(A2,A4,A6,A8,A10), {1,2,3,4})) 

帮帮我?

使用您提供的示例数据,类似这个常规公式(不需要数组input)应该适合您,因为百分比总是小于或等于1:

 =SUMPRODUCT(LARGE((A1:A10<=1)*A1:A10,{1,2,3,4})) 

如果您想要更灵活地抓取前N个数字,您可以使用ROW()函数replace{1,2,3,4} ,如下所示:

 =SUMPRODUCT(LARGE((A1:A10<=1)*A1:A10,ROW(1:4))) 

编辑 :如果获得相对值的唯一方法是,如果他们是从第2行开始的每隔一行,则可以使用此公式代替:

 =SUMPRODUCT(LARGE(INDEX((MOD(ROW(A1:A10),2)=0)*A1:A10,),ROW(1:4))) 

对于你的简单例子,假设B1:B4包含值1,2,3,4。 然后在C1:C4中input数组公式:

 {=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))} 

(使用Ctrl + Shift + Enter作为数组公式接受)

会给你前四名的总和。

这假定这些数字都是正数。 如果该假设无效,则可以将公式中的-1replace为所有值-1的最小值。

另一种方法是,如果相对单元格的标准太简单,不能用一个简单的公式来概括,但是如果你有一个单元格的列表,则使用Indirect函数:

在这里输入图像说明

在上面的截图中,我列出了包含相对值的单元格。 在D1我把公式=INDIRECT(C1)并复制下来。 那么,公式

 =SUM(LARGE(D1:D5,{1,2,3,4})) 

返回所需的总和。

虽然函数INDIRECT似乎不能很好地处理数组公式,但可能有一种办法可以省略助手列。

在编辑:这是一个VBA解决scheme:

 '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) 

这最后返回从2,4,6,8,10的条目中得出的最大4的总和