在excel数组公式中使用最小值/最大值

在excel数组公式中使用最小值/最大值,excel,max,min,array-formulas,Excel,Max,Min,Array Formulas,我在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 + ... 换句话说,我写的公式(

我在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)}
虽然这个公式满足了我在这种情况下的需要,但我认为这是一个糟糕的解决方案,因为我发现它很难阅读和扩展。例如,如果D列中有另一个参数,且系数为MIN(MAX(A$1:A$9;E1);D1),则使用if将导致一个非常长、非常不可读且复杂的公式

有更好的办法解决我的问题吗?谢谢大家!


注意:由于我使用的是意大利语版的excel,语法可能会略有不同。

问题在于MAX将数组作为参数。通常使用数组的函数永远不会返回数组-它们被设计为将数组转换为一个数字。无论你向MAX抛出多少数组,它总是只返回一个数字

我想不出一个好的解决方案,所以这里有一个坏的

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

=SUMPRODUCT((A1:A9*(A1:A9>E1))+(E1*(A1:A9我不记得曾经解决过这个问题,但为了维护性,我可能会这样做:

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

另一种可能性是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,"<")

=SumMaxMin(A1:A9,B1:B9,E1,“>”,D1,避免重复单元格引用的另一种可能性是:

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

如果我正确理解问题,使用If而不是MAX应该可以:


=总和(如果($A$1:$A$9>E1;$A$1:$A$9;E1)*$B$1:$B$9)

你能详细说明拒绝你提出的数组公式的原因吗?我不太喜欢你的例子中使用更多的参数。在我看来,数组公式是解决你最初问题的最有效、最合乎逻辑的解决方案,也许你应该重新撰写你的文章,以便它更加强调t这些附加参数。如果你想用D1中的一个值来“封顶”最大值,那么公式将是
{=SUM(MIN(D1,If(a$1:a$9>E1,a$1:a$9,E1))*B$1:B$9)}
,这似乎没有太大的延伸。对于记录,你可以使用identity
MAX(A1,E1)=(A1+E1+ABS(A1-E1))/2
(如下所示)如果
A1
E1
被长公式取代,这可能会很有用,但实际上
if
是最简单的选择。你指出了真正的问题:MAX只返回一个数字,因此没有我一直在寻找的简单解决方案。我们的解决方案非常相似,但你的解决方案更优雅一点。谢谢这个公式比我的公式更优雅,但它保留了相同的问题,所以这只是向前迈出了一小步。谢谢!这一个似乎是唯一真正的解决方案,让用户可以不受限制地做任何他需要的事情。我不接受这个作为正确答案,因为在你的另一个公式中,你指出了真正的问题是什么,并回答了t他在标题中提出了一个问题。