在Excel数组公式中使用MIN/MAX

abithluo  于 2023-04-22  发布在  其他
关注(0)|答案(6)|浏览(140)

我在excel中有一个简单的数组公式,它不像我希望的那样工作。在A列和B列中有数据(A1与B1配对,依此类推),而在F列中有基于E列中参数的计算。
在单元格F1中,公式为:

{=SUM(MAX(A$1:A$9, E1)*B$1:B$9)}

这个公式的作用是:

=MAX(A$1:A$9, E1)*B$1 + MAX(A$1:A$9, E1)*B$2 + ...

相反,我需要一个公式来做到这一点:

=MAX(A$1, E1)*B$1 + MAX(A$2, E1)*B$2 + ...

换句话说,我写的公式(第一个)总是找到从A1到A9的值和E1之间的最大值,将其乘以第i个B值并将结果求和。我需要的是一个公式,它找到第i个A值和E1之间的最大值,而不是所有A值之间的最大值。
我所寻找的是很容易通过在列C中添加公式=MAX(A1;E$1)*B1,然后在F1中只是=SUM(A1:A9),但我不能使用这个解决方案,因为在F列中重复了相同的公式,每次E参数都在变化。
我可以使用IF指令:在F1我可以写

{=SUM(IF(A$1:A$9>E1, A$1:A$9, E1)*B$1:B$9)}

虽然这个公式在这种情况下满足了我的需要,但我认为这是一个糟糕的解决方案,因为我发现它很难阅读和扩展。E1);D1),使用IF将导致非常长且非常不可读和复杂的公式。
有更好的解决方案吗?谢谢大家!
注意:语法可能会有一点不同,因为我使用的是意大利语版本的excel。

hgc7kmma

hgc7kmma1#

问题是MAX接受一个数组作为参数。通常接受数组的函数永远不会返回数组-它们被设计为将数组转换为一个数字。无论你向MAX抛出多少个数组,它总是只返回一个数字。
我想不出一个好的解决办法,所以这里有一个坏的

=SUMPRODUCT(((A1:A9*(A1:A9>E1))+(E1*(A1:A9<=E1)))*B1:B9)

我不认为这真的增加了您试图避免的基于IF的公式的可维护性。

dbf7pr2w

dbf7pr2w2#

另一种可能性是VBA函数。

Public Function SumMaxMin(rRng1 As Range, rRng2 As Range, ParamArray vaMinMax() As Variant) As Double

    Dim rCell As Range
    Dim dReturn As Double
    Dim aMult() As Double
    Dim lCnt As Long
    Dim i As Long

    ReDim aMult(1 To rRng1.Cells.Count)

    For Each rCell In rRng1.Cells
        lCnt = lCnt + 1
        aMult(lCnt) = rCell.Value
        For i = LBound(vaMinMax) To UBound(vaMinMax) Step 2
            If Not Evaluate(aMult(lCnt) & vaMinMax(i + 1) & vaMinMax(i)) Then
                aMult(lCnt) = vaMinMax(i)
            End If
        Next i
    Next rCell

    For i = LBound(aMult) To UBound(aMult)
        dReturn = dReturn + aMult(i) * rRng2.Cells(i).Value
    Next i

    SumMaxMin = dReturn

End Function

为了你的榜样

=SumMaxMin(A1:A9,B1:B9,E1,">")

添加其他条件

=SumMaxMin(A1:A9,B1:B9,E1,">",D1,"<")

如果区域的单元格数不相同,或者传递的参数不适用于Evaluate,则会出错。

qeeaahzv

qeeaahzv3#

避免重复单元格引用的另一种可能性是:

=SUM(B1:B9*ABS(A1:A9-E1*{1,-1}))/2

假设值是非负的。更一般地,返回成对最大值的数组:

=MMULT((A1:A9-E1*{1,-1})^{2,1}^{0.5,1},{1;1}/2)

其返回:

MAX(A1,E1)
MAX(A2,E1)
...
MAX(A9,E1)
ewm0tg9j

ewm0tg9j4#

我不记得曾经破解过这个问题,但为了可维护性,我可能会这样做:

{=SUM((A1:A9<E1)*E1*B$1:B$9)    +    SUM((A1:A9>=E1)*A1:A9*B$1:B$9)}
z9ju0rcb

z9ju0rcb5#

如果我正确理解了这个问题,使用IF而不是MAX应该做到:
=SUM(IF($A$1:$A$9>E1;$A$1:$A$9;E1)*$B$1:$B$9)

6yjfywim

6yjfywim6#

已经有很多很好的答案了,但是下面的公式与原始问题中的公式只相差一个字符。
将AMAX定义为LAMBDA函数:

=LAMBDA(arraya,arrayb,IF(arraya>arrayb,arraya,arrayb))

你可以在单元格F1中输入:

=SUM(AMAX(A$1:A$9, E1)*B$1:B$9)

相关问题