从Excel

时间:2016-09-23 06:18:56

标签: excel excel-formula aggregate

在Excel中,我存储了项目,对于每个项目,我知道我使用了多少以及在给定时间内我得到了多少:

Item 1  10
Item 2  20
Item 2  -10
Item 2  5
Item 1  10
Item 1  -5

当价值为正数时,我知道这是一个收益,当它是负数时,那就是一个损失。

只需使用SUMIF,我就可以知道我目前从给定项目中获得了多少。

但是我想知道我曾经拥有的最高金额是多少。在此示例中,例如,对于项目1,该数字将为20。我知道我可以在每个项目的不同列中计算部分结果,然后在那些项目上使用MAX,但我想找到一个解决方案,用一个方程解决这个问题。

2 个答案:

答案 0 :(得分:1)

似乎较新的AGGREGATE¹ function可以使用其循环处理来模仿=SUMIFS(B$2:B2, A$2:A2, A2)的“帮助”列。

在F5中作为标准公式,

=AGGREGATE(14, 6, SUMIFS(OFFSET(B$2, 0, 0, ROW($1:$6), 1), OFFSET(A$2, 0, 0, ROW($1:$6), 1), E5), 1)

aggregate_sumifs

由于OFFSET function具有固有的易变性特性,我通常不会改变它的使用,但重新改变范围以求求它。

¹ Excel 2010引入了AGGREGATE function。早期版本不提供。

²当整个工作簿中的任何内容发生更改时,挥发性函数会重新计算,而不仅仅是在影响其结果的内容发生更改时。 易失性函数的示例包括INDIRECTOFFSETTODAYNOWRANDRANDBETWEENCELLINFO工作表函数的某些子函数也会使它们变得不稳定。

答案 1 :(得分:0)

您可以使用VBA代码为工作表添加宏:

Public itemMax As Integer

Private Sub Worksheet_Activate()
    Set itemMax = -1
End Sub

Private Sub Worksheet_Change(ByVal target As Range)
    If Not (Intersect(target, Range("B1:B100")) Is Nothing) Then
        If IsNumeric(target) Then
            If target > itemMax Then
                itemMax = target
                MsgBox ("New max is: " & CStr(itemMax))
            End If
        End If
    End If
End Sub

在这个例子中,我跟踪itemMax中的“全局最大值”并检查是否添加了任何新项目数大于故意设置的最大值。我假设你一个接一个地手动输入这些值,所以YMMV。