Функция массива в Excel, которая возвращает любую дату из столбца A, где строка соответствует всем трем критериям в столбце G - PullRequest
0 голосов
/ 28 января 2019

вопрос Excel для функции массива Требуется функция массива в ячейке I3, которая возвращает любую дату из столбца A, где строка соответствует всем трем критериям в столбце G (Дата начала, Дата окончания и Минимальный доход)

Я знаю, что INDEX даст точную строку, но в этом случае я не могу понять, как получить доступ к правильной строке нет

{=INDEX(A3:A14,IF((A3:A14>=G2)*(A3:A14<=G3)*(C3:C14>=G4),ROW(A3:A14)))}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Другое возможное решение - VBA.Предположим, что все данные отображаются на листе 1. Импортируйте приведенный ниже код в событие изменения листа 1.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LastrowA As Long, LastrowI As Long, i As Long
    Dim StartDate As Date, EndDate As Date
    Dim MinimunRevenue As Double

    'Check if Criteria range affected
    If Not Intersect(Target, Range("G1:G3")) Is Nothing Then

        'Check if all criteria are imported
        If Not IsEmpty(Range("G1").Value) = True And Not IsEmpty(Range("G2").Value) = True And Not IsEmpty(Range("G3").Value) = True Then

            With ThisWorkbook.Worksheets("Sheet1")
                LastrowA = .Cells(.Rows.Count, "A").End(xlUp).Row
                'Get Criteria Values
                StartDate = .Range("G1").Value
                EndDate = .Range("G2").Value
                MinimunRevenue = .Range("G3").Value

                'Loop all lines
                For i = 2 To LastrowA

                    'Chek if contitions meet
                    If (.Range("A" & i).Value >= StartDate And .Range("A" & i).Value <= EndDate) _
                        And .Range("C" & i).Value >= MinimunRevenue Then
                            'If conditions meet import lines in the new table
                            Application.EnableEvents = False
                                LastrowI = .Cells(.Rows.Count, "I").End(xlUp).Row
                                .Range("I" & LastrowI + 1).Value = .Range("A" & i).Value
                                .Range("J" & LastrowI + 1).Value = .Range("B" & i).Value
                                .Range("K" & LastrowI + 1).Value = .Range("C" & i).Value
                                .Range("L" & LastrowI + 1).Value = .Range("D" & i).Value
                            Application.EnableEvents = True
                    End If

                Next i

            End With

        End If

    End If

End Sub

Результаты:

enter image description here

0 голосов
/ 28 января 2019

Почти там - вам просто нужно сместить номер строки на индекс, основанный на 1, а затем использовать SMALL(), чтобы набрать наименьшую строку в массиве:

{=INDEX(A3:A14,SMALL(IF((A3:A14>=G2)*(A3:A14<=G3)*(C3:C14>=G4),ROW(A3:A14)-ROW(A3)+1),1))}

Редактировать - в соответствии с запросом OP

SMALL([array/range],[k]) - простая функция, которая возвращает n-й (аргумент k) наименьший результат из массива / диапазона.

как текущийМассив IF() создаст результирующий массив либо FALSE, либо номера строки (что-то вроде {FALSE;2;FALSE;4;FALSE;FALSE;7} и т. Д. Без SMALL - мы получим только первый возвращенный результат, поэтому, если ваши критерии не соответствуют первой строке, выВместо этого мы получим ошибку.

Используя SMALL([IF-Array],1), мы можем получить первый наименьший результат из этого массива, который соответствует первой строке, где выполнены все критерии.

Вы можетеразверните эту формулу, чтобы использовать ROW(1:1) в качестве аргумента [k], который позволит вам перетащить формулу вниз, чтобы получить каждое совпадение после этого

...