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

Using MIN/MAX in excel array formula

我在 excel 中有一个简单的数组公式,它无法按我希望的方式工作。 A 列和 B 列中有数据(A1 与 B1 配对,依此类推),而 F 列中有基于 E 列中参数的计算。

在单元格 F1 中,公式为:

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

这个公式的作用是:

=MAX(A:A, E1)*B + MAX(A:A, E1)*B + ...

相反,我需要一个执行此操作的公式:

=MAX(A, E1)*B + MAX(A, E1)*B + ...

换句话说,我写的公式(第一个)总是在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:A>E1, A:A, E1)*B:B)}

虽然这个公式可以满足我在这种情况下的需要,但我认为这是一个糟糕的解决方案,因为我发现它很难阅读和扩展。比如D列还有一个参数,因子是MIN(MAX(A$1:A$9;E1);D1),用IF会导致公式很长很复杂,很难读

我的问题有更好的解决方案吗?谢谢大家!

注意:语法可能略有不同,因为我使用的是 excel.

的意大利语版本

问题在于 MAX 将数组作为参数。通常采用数组的函数从不 return 数组 - 它们旨在将数组转换为一个数字。无论你在 MAX 中抛出多少数组,它总是 return 一个数字。

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

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

我认为这不会真正提高您试图避免的基于 IF 的公式的可维护性。我认为您受困于 IF 或辅助列。

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

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

另一种可能性是 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,则会出错。

另一种避免重复引用单元格的方法是:

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

假设值为非负数。更一般地 return 成对最大值数组:

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

其中 return 个:

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

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

=SUM(IF($A:$A>E1;$A:$A;E1)*$B:$B)