Как получить минимальное значение в группе?

Пример:

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) Как я могу получить значения для столбца «Макс.»?

В настоящее время я использую сводную таблицу, но пользователи жалуются, что она слишком медленная и может сделать Excel невосприимчивым.

Я пытался использовать функции массива с такой формулой:

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

Это не актуально, и мне нужны некоторые механизмы для обновления данных. Пользователи сказали, что они не хотят, чтобы еще одна кнопка обновляла данные.

(2) Предполагая, что существует формула для решения вышеизложенного, мой столбец «Значение» — это дата, которая может быть пустой, и мое требование также состоит в том, чтобы получить минимальную дату в группе, игнорируя любые пробелы.


person Raymond    schedule 14.06.2013    source источник


Ответы (2)


В C2 введите формулу массива:

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

и скопируйте вниз.

Формулы массива необходимо вводить с помощью Ctrl + Shift + Enter, а не просто Enter ключ. Если это сделано правильно, формула появится в фигурных скобках вокруг нее в строке формул.

person Gary's Student    schedule 14.06.2013

Несколько вещей... Моя первая проблема заключалась в том, что моя существующая электронная таблица была настроена на «ручной расчет» вместо «автоматического расчета». (в меню Формулы | Параметры расчета).

Вот пример кода, который я использую для добавления расчета минимальной даты на основе «группировки» из другого столбца. (ПРИМЕЧАНИЕ: в моей электронной таблице около 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
person Raymond    schedule 17.06.2013