Excel - 如何获取组中的最小值

时间:2013-06-14 17:50:12

标签: excel-vba excel-formula pivot-table array-formulas vba

我简化了我的例子:

ID  Value   MAX
Group1  2   6
Group1  4   6
Group1  6   6
Group2  1   3
Group2  3   3
Group3  7   8
Group3  4   8
Group3  2   8
Group3  8   8
Group4  1   3
Group4  2   3
Group4  3   3
Group5  7   7

列'MAX'具有我想要的结果

我的两部分问题是

(1)我可以通过哪些方法获取“Max”列的值?

我目前正在使用数据透视表来帮助支持此功能,但是用户抱怨它太慢并且可能使Excel无响应。

然后我尝试使用如下公式的数组函数:

=MAX(IF($A$9:$A$21=A12,$B$9:$B$21))

这很有效,但不幸的是,我了解到它并不是最新的,我需要一些机制来刷新数据......用户已经说过他们不想要另一个按钮来刷新数据。 / p>

我还可以使用其他功能吗?

你会使用VBA和一些'on-open,on-close'活动吗?或者也许在VBA中完成这一切?

(2)假设有一个很好的公式来解决上述问题,我还要求我的Value列实际上是一个可能为空的日期,我的实际要求是获取组中的最小日期,忽略任何空白。关于等式的任何提示?!

感谢。

2 个答案:

答案 0 :(得分:9)

在C2中输入数组公式:

=MAX(IF(A:A=A2,B:B))  

并复制下来。

必须使用CTRL-SHIFT-ENTER输入数组公式,而不仅仅是输入键

答案 1 :(得分:0)

一些事情......我的第一个问题是我现有的电子表格设置为“手动计算”而不是“自动计算”。 (在“公式|计算选项”菜单下。)

以下是我用来添加的一些示例代码,根据另一列的“分组”计算最小日期。 (注意:我的电子表格大约有1500行,我注意到在更改单元格并让公式更新时速度变慢)

Sub AddFormulaToCalculateEarliestRevisedDate()
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    Dim identifierColumn As String
    Dim identierRow As String
    Dim identifierRange As String
    Dim valueRange As String
    Dim formulaColumn As String
    Dim formulaRange As String

    Dim myIdentifierRange As Range
    Dim myFormulaRange As Range
    Dim lastRow As String
    lastRow = ActiveSheet.Range("C5000").End(xlUp).Row

    identifierColumn = "B"
    identifierRange = "B6:B" & lastRow
    valueRange = "AP6:AP" & lastRow
    formulaColumn = "CZ"
    formulaRange = "CZ6:CZ" & lastRow

    Set myIdentifierRange = ActiveSheet.Range(identifierRange)
    Set myFormulaRange = ActiveSheet.Range(formulaRange)

    ' delete any existing any array formulas first! otherwise, get error
    myFormulaRange.ClearContents
    myFormulaRange.NumberFormat = "m/d/yyyy;;" ' notice the ;; to handle zero dates 1/0/1900 to be blank

    ' loop through each row and set the array formula
    Dim identifierCell As String
    Dim arrayFormula As String
    Dim r As Range
    For Each r In myIdentifierRange.Rows

        ' example: arrayFormula = {=MIN(IF($B$6:$B$5000=B6,$AP$6:$AP$5000))}
        identifierCell = identifierColumn & r.Row
        arrayFormula = "MAX(IF(" & identifierRange & "=" & identifierCell & "," & valueRange & "))"

        Range(formulaColumn & r.Row).FormulaArray = "=" & arrayFormula
    Next


    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub