Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel:将非连续单元格数组中的N个最大数相加_Excel_Vba - Fatal编程技术网

Excel:将非连续单元格数组中的N个最大数相加

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)。在我的实际表格中,这些值不同,数字是随机的。第二个值的%分数取决于某个键等。因此,这是一个简化的表示形

我的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个中的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
函数提供的范围内的每个单元格计算它