Функция Excel MAXIF или эмуляция? - PullRequest
5 голосов
/ 23 марта 2010

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

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

Ответы [ 3 ]

5 голосов
/ 23 марта 2010

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

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

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

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

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

РЕДАКТИРОВАТЬ Кстати, вы хотели сделать это программно или вручную? Если программно, то какую среду вы используете? VBA? C #

РЕДАКТИРОВАТЬ При использовании 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))"
3 голосов
/ 25 января 2014

Формулы массива работают не очень хорошо, если вы хотите использовать динамические или именованные диапазоны (например, «максимальная сумма для строк выше текущей строки, которые имеют того же контрагента, что и текущая строка). Если вы этого не сделаете Если вы хотите использовать формулу массива, вы всегда можете прибегнуть к 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
1 голос
/ 12 декабря 2016

Ограничение с кодом, предоставленным до сих пор, состоит в том, что вы ограничены двумя условиями. Я решил продолжить этот код, чтобы не ограничивать количество условий для функции 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 до нескольких условий.

Этот код был разработан со ссылкой на несколько кодов, размещенных Хансом V в зале отдыха Эйлин.

Счастливое кодирование

Дидрих

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...