Я не эксперт в 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+, ENTERчтобы создать и создать массив формул и перетащите его вниз по всей длине таблицы.
Это решение не полностью проверено, хотя. Это будет хорошо работать только в том случае, если вы начнете данные в строке 1, иначе ссылка будет неправильной, если вы не манипулируете ею, используя предыдущую ссылку на строку. Попробуйте и вернитесь назад. Также проверяйте более разумные решения других пользователей.
Обновить
Я понимаю, что, хотя константные массивы работали, а Cell Reference не работали (что привело меня к созданию UDF, возвращающего массив), использование функции TRANSPOSE фактически создает внутри себя своего рода константный массив. Так что просто замените UDF на TRANSPOSE, завернутый в IF, и решение будет работать без кода VBA и каких-либо вспомогательных столбцов.
Попробуйте и проверьте, подходит ли вам это.
Формула массива в 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)))
Вот как выглядит результат после долгого дня размышлений:
Было создано 4 вспомогательных столбца с формулами массива из одной ячейки.
Клетка
C1
вниз:Клетка
D1
вниз:Клетка
E1
вниз:Клетка
F1
вниз:И ответ,
G1
вниз:Было бы неплохо иметь это в одной колонке, ну да ладно ... :)
источник
Друзья теперь это моя крачка .
По сути, запрос состоит в том, чтобы найти самую последнюю ( недавнюю ) дату для Code1, Code2 и Code3, если у него есть соответствующее значение совпадения A в ColA (проверьте исходную запись запроса) .
Это означает, что оба должны быть испытаны. Поскольку Code3 появился дважды 1-й с A, а затем с B.
И, как я написал «Последний - это недавно», функция MAX не может быть использована, «МИН» находит последнюю.
Проверьте снимок экрана ,,
Формула есть,
= IF (D423: D428 = "A", IF (E423: E428 = ({"Code1", "Code", "Code3"}), MIN (F423: F428)))
Даже формула без массива решила проблему.
NB. Вы можете изменить формулу, используя свой диапазон данных.
Я разместил решение после того, как оно было проверено мной, если оно отличается, просто прокомментируйте.
источник
С небольшим исправлением я привел решение, которое находит Недавнюю дату только в пределах необходимой области, Фильтрует данные, используя Критерии, A и Code1, Code2 или Code3.
{= MAX (IF (D423: D428 = "A", IF (E423: E428 = {"Code1", "Code", "Code3"}, F423: F428, "")))}
источник