Как найти максимальное значение в диапазоне при соблюдении определенных условий - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть два столбца, столбец «№» имеет номера 7 и 8 (в общем, 7 - это слой, а 8 - это подслои, 7 образует группу из 8), столбец «Значение» показывает критический уровень для каждых 8 (эти уровни диапазон от 1 до 4). Мне нужно найти значение MAX в столбце «Значение», соответствующее определенной группе 8 с, и оно должно быть показано против числа 7 в столбце «Значение»

Вот сама таблица

Table

Я пытался использовать основные функции Excel. На данный момент я придумал

=MAX(OFFSET(B3;0;0;MATCH($A$2;A3:$A$8000;0);0))

Где A8000 - это просто верхний предел, достаточный для включения всего массива Важное примечание: у меня много групп, и диапазон 8 варьируется для каждого конкретного 7

Есть ли способы достижения этой цели с помощью VBA? Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Проблема в вашей формуле заключается в том, что ширина в функции смещения не может быть 0, она должна быть 1.

Пожалуйста, попробуйте вот так ...

=IFERROR(MAX(OFFSET(B3;;;MATCH(A2;A3:$A$8000;0)-1));"")

enter image description here

0 голосов
/ 26 апреля 2019

Подпрограмма ниже делает то, что вы хотите

Не забудьте изменить ссылки, где это необходимо

Sub maxinrange()

With Workbooks(REF).Sheets(REF)
    'Find the first 7
    Set seven = .Range("A:A").Find("7", lookat:=xlWhole)
    If Not seven Is Nothing Then
        'Save the row of the first 7 to prevent an endless loop in the future
        frow = seven.Row

        Do While Not seven Is Nothing
            'Determine the following 7 to get the range over which the max value should be calculated
            Set nextseven = .Range("A:A").FindNext(seven)
            If Not nextseven Is Nothing Then
                If Not nextseven.Row = frow Then
                    seven.Offset(, 1).Value = Application.WorksheetFunction.Max(.Range(seven.Offset(1, 1).Address & ":" & nextseven.Offset(-1, 1).Address))
                Else
                    'If no following 7 was found, calculate all the way down to the last row
                    seven.Offset(, 1).Value = Application.WorksheetFunction.Max(.Range(seven.Offset(1, 1).Address & ":" & .Cells(.Rows.Count, 1).Address))
                End If
            End If
            Set seven = .Range("A:A").FindNext(seven)
            If Not seven Is Nothing Then
                'If the found 7 is the same as the first found 7, exit the loop
                If seven.Row = frow Then Exit Do
            End If
        Loop
    End If
End With

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