Excel:在非连续单元格数组中求和N个最大数

时间:2016-04-18 13:21:28

标签: excel excel-vba 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)。在我的实际表中,这些值不同,数字是随机的。第二个值的%分数取决于某个键等。所以这是一个简化的表示,为了一个最小的例子。

我想确定最大的4个(满分5个)数字的总和,但仅限于那些1%(例如0.1,而不是10)的数值。这些数字都在彼此之下。基本上,我想忽略绝对数字(例如10)并且仅应用相对(例如0.1)数字。

LARGE函数确定最大的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}))

帮助?

2 个答案:

答案 0 :(得分:0)

对于简化示例,假设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))}

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

将为您提供前4名的总和。

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

另一种方法,如果作为相对单元格的标准过于特殊而无法通过简单公式进行汇总,但如果您有单元格列表,则使用Indirect函数:

enter image description here

在上面的屏幕截图中,我列出了包含相对值的单元格。在D1中,我将公式=INDIRECT(C1)复制下来。然后,公式

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

返回所需的总和。

可能有一种方法可以省去辅助列,尽管函数INDIRECT似乎与数组公式不太匹配。

On Edit:这是一个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)

这最后返回从2,4,6,8,10

的条目中抽取的最大4的总和

答案 1 :(得分:0)

使用您提供的样本数据,这样的常规公式(不需要数组输入)应该对您有用,因为百分比总是小于或等于1:

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

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

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