Мои данные находятся в первых двух таблицах (A1:B6 и D1:F6):

вложенные формулы многоэлементного массива

Мой конечный результат на I1:I4 для каждого соответствующего значения в H1:H4 .

Например, вы берете значение "A", вы находите каждый соответствующий код из B1:B6 (т. Е. "Code1", "code2" и "code3"), затем ищите самую последнюю дату в E1:E5 (соответствует коды из предыдущего шага) и дать результат, соответствующий дате значения в D1:D5 .

Я застрял на этапе поиска самой последней даты. Я попробовал это:

{=IF($F$1:$F$5=IF($A$1:$A$6=$H$1,$B$1:$B$6),$E$1:$E$5)}
{=IF($F$1:$F$5={IF($A$1:$A$6=$H$1,$B$1:$B$6)},$E$1:$E$5)}

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

4 ответа4

3

Я не эксперт в Excel! Однако я понимаю, что формула отлично работает в MAX, когда ей передается абсолютный массив, а не массив, возвращенный из IF. Я предполагаю, что это потому, что результирующие длины двух массивов не совпадают с возвратом # N/A для избыточного значения, и это переводит всю формулу в # N/A. Смотрите этот скриншот ниже.

Это привело меня к созданию очень простого UDF в VBA, который возвращает только необходимый массив. В этом UDF нет большого количества проверок. Убедитесь, что передается только одна ссылка на столбец, и ожидаемые возвращаемые значения существуют в соседнем столбце справа. Например, если вы передадите A1:A4, он проверит значения в B1:B4.

Нажмите ALT + F11, чтобы получить доступ к VBA Editor, Insert -> Module и вставьте в него следующий код.

Public Function RetArray(r1 As Range, a As String) As Variant

Dim i
i = 0
Dim myarray()

For Each cell In r1
    If cell.Value = a Then
        i = i + 1
    End If
Next cell
ReDim myarray(i)
Dim j
j = 0
For Each cell In r1
    If cell.Value = a Then
       myarray(j) = cell.Offset(0, 1).Value
       j = j + 1
    End If

Next cell
RetArray = myarray
End Function

Мы будем использовать этот UDF в окончательном решении. например, чтобы получить массив столбца B, где A - H1, используйте эту формулу как =RetArray(A1:A6,H1)

Следующая сложная часть состоит в том, чтобы отобразить это возвращенное значение в точное местоположение в столбце E и получить значение из D.

Сначала создайте в C вспомогательную колонку, которая является конкатенацией D & E

Формула в С1 есть =E1&F1 и перетащите ее вниз к нужным ячейкам ниже. Убедитесь, что ваша Дата имеет допустимый формат даты в Excel, а не как текст, иначе это решение не будет работать.

Ваш стол в H1:H4.

Теперь в I1 положим следующую формулу.

=INDEX($D$1:$D$9,MIN(IF($C$1:$C$9=MAX(IF($F$1:$F$9=RetArray($A$1:$A$8,H1),$E$1:$E$9,0))&RetArray($A$1:$A$8,H1),ROW($C$1:$C$9),99^99)))

Нажмите CTRL + SHIFT + ВВОД, чтобы создать формулу массива и перетащите ее вниз по всей длине таблицы.

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

Обновить

Я понимаю, что, хотя константные массивы работали, а Cell Reference не работали (что привело меня к созданию UDF, возвращающего массив), использование функции TRANSPOSE фактически создает внутри себя своего рода константный массив. Так что просто замените UDF на TRANSPOSE, завернутый в IF, и решение будет работать без кода VBA и столбца Helper.

Попробуйте и проверьте, подходит ли вам это.

Формула массива в I1 и вниз

=INDEX($D$1:$D$9,MIN(IF($E$1:$E$9&$F$1:$F$9=MAX(IF($F$1:$F$9=TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),$E$1:$E$9,0))&TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),ROW($C$1:$C$9),99^99)))

1

Вот как выглядит результат после долгого дня размышлений:

Результаты

Было создано 4 вспомогательных столбца с формулами массива из одной ячейки.

Ячейка C1 вниз:

{=MAX(IF(B1=$K$1:$K$5,$J$1:$J$5))}

Ячейка D1 вниз:

{=IFERROR(INDEX($I$1:$I$5,MATCH(1,(B1=$K$1:$K$5)*(C1=$J$1:$J$5),0)),"")}

Ячейка E1 вниз:

{=MAX(IF(A1=$A$1:$A$6,$C$1:$C$6))}

Ячейка F1 вниз:

{=INDEX($B$1:$B$6,MATCH(1,(A1=$A$1:$A$6)*($C$1:$C$6=E1),0))}

И ответ, в G1 вниз:

{=INDEX($D$1:$D$6,MATCH(1,($B$1:$B$6=F2)*($C$1:$C$6=E2),0))}

Было бы неплохо иметь это в одной колонке, ну да ладно ... :)

0

Друзья теперь это моя крачка.

По сути, запрос состоит в том, чтобы найти самую последнюю ( недавнюю ) дату для Code1, Code2 и Code3, если у него есть соответствующее значение совпадения A в ColA (проверьте исходную запись запроса).

Это означает, что оба должны быть испытаны. Поскольку Code3 появился дважды 1-й с A, а затем с B.

И, как я написал «Последний - это недавно», функция MAX не может быть использована, «МИН» находит последнюю.

Проверьте снимок экрана ,,

Формула есть,

= IF(D423:D428 = "A", IF(E423:E428 =({"Code1", "Code", "Code3"}), MIN(F423:F428)))

Даже формула без массива решила проблему.

NB. Вы можете изменить формулу, используя свой диапазон данных.

Я разместил решение после того, как оно было проверено мной, если оно отличается, просто прокомментируйте.

0

С небольшим исправлением я привел решение, которое находит Недавнюю дату только в пределах необходимой области, Фильтрует данные, используя Критерии, A и Code1, Code2 или Code3.

{= MAX(IF(D423:D428 = "A", IF(E423:E428 = {"Code1", "Code", "Code3"}, F423:F428, "")))}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .