我不是那么流利的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}))
帮助?
答案 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
函数:
在上面的屏幕截图中,我列出了包含相对值的单元格。在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)))