Функция Excel MAXIF или эмуляция?

У меня есть набор данных среднего размера в excel, из которого я хотите извлечь максимальное значение значений в столбце B, но те, которые соответствуют только ячейкам в столбце A, которые удовлетворяют определенным критериям.

Желаемая функциональность похожа на SUMIF или COUNTIF, но ни одна из них не возвращает данные, которые необходимы. Нет функции MAXIF; как мне подражать одному?


person Andrew Buss    schedule 23.03.2010    source источник


Ответы (3)


Вы можете использовать формулу массива. В ячейку, в которой вы хотите вычислить максимальное значение, введите: =Max(If([test],[if true],[if false]), где вы заменяете значения в квадратных скобках тестом, что вернуть, если правда, и что вернуть, если ложь.Например:

=MAX(IF(MOD(A2:A25,2)=0,A2:A25,0)

В этой формуле я возвращаю значение в столбце A, если значение, разделенное на 2, не имеет остатка. Обратите внимание, что я использую диапазон ячеек в своем сравнении и в значении, если оно ложно, а не одну ячейку.

Теперь, продолжая редактировать ячейку, нажмите Ctrl+Shift+Enter (удерживая нажатой клавишу Ctrl и Shift вместе, а затем нажмите Enter).

Это создает формулу массива, которая действует на каждое значение в диапазоне.

ИЗМЕНИТЬ Кстати, вы хотели сделать это программно или вручную? Если программно, то какую среду используете? VBA? С#?

EDIT Если через VBA, вам нужно использовать свойство FormulaArray и ссылки R1C1 следующим образом:

Range("A1").Select
Selection.FormulaArray = "=MAX(IF(MOD(R[1]C:R[24]C,2)=0,R[1]C:R[24]C,0))"
person Thomas    schedule 23.03.2010

Формулы массива не очень хорошо работают, когда вы хотите использовать динамические или именованные диапазоны (например, «максимальная сумма к оплате для строк выше текущей строки, которые имеют того же контрагента, что и текущая строка). Если вы не хотите использовать формулу массива, вы всегда можете прибегнуть к VBA, чтобы сделать что-то вроде этого:

Function maxIfs(maxRange As Range, criteriaRange As Range, criterion As Variant) As Variant

  maxIfs = Empty
  For i = 1 To maxRange.Cells.Count
    If criteriaRange.Cells(i).Value = criterion Then
        If maxIfs = Empty Then
            maxIfs = maxRange.Cells(i).Value
        Else
            maxIfs = Application.WorksheetFunction.Max(maxIfs, maxRange.Cells(i).Value)
        End If
    End If
  Next
End Function
person Ken Pierce    schedule 24.01.2014

Ограничение кода, предоставленного до сих пор, заключается в том, что вы ограничены двумя условиями. Я решил расширить этот код, чтобы не ограничивать количество условий для функции MaxIfs. Пожалуйста, смотрите код здесь:

        Function MaxIfs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant
        Dim n As Long
        Dim i As Long
        Dim c As Long
        Dim f As Boolean
        Dim w() As Long
        Dim k As Long
        Dim z As Variant

        'Error if less than 1 criteria
        On Error GoTo ErrHandler
        n = UBound(Criteria)
        If n < 1 Then
            'too few criteria
            GoTo ErrHandler
        End If
            'Define k
            k = 0            

        'Loop through cells of max range
        For i = 1 To MaxRange.Count

        'Start by assuming there is a match
        f = True

            'Loop through conditions
            For c = 0 To n - 1 Step 2

                'Does cell in criteria range match condition?
                If Criteria(c).Cells(i).Value <> Criteria(c + 1) Then
                    f = False
                End If

            Next c

            'Define z
            z = MaxRange

            'Were all criteria satisfied?
            If f Then
                k = k + 1
                ReDim Preserve w(k)
                w(k) = z(i, 1)
            End If

        Next i

        MaxIfs = Application.Max(w)

        Exit Function
        ErrHandler:
        MaxIfs = CVErr(xlErrValue)

    End Function

Этот код допускает от 1 до нескольких условий.

Этот код был разработан со ссылкой на несколько кодов, опубликованных Гансом В. в Eileen's Lounge.

Удачного кодирования

Дидрих

person Diedrich    schedule 12.12.2016