Многоячеистые массивы фурмул, вложенные


0

Мои данные по первым 2 таблицам ( 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)}

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

Ответы:


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+, 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)))

введите описание изображения здесь


Спасибо! Я ценю ваши усилия. Я проголосовал за ответ, но пока не буду отмечать его как ответивший. Как-то кажется, должен быть вариант без VBA, а также, проще, чем мой собственный ответ. Я очень хорошо знаю VBA, но в настоящее время стараюсь этого избегать. Спасибо!
ZygD

Нашел использование TRANSPOSE вместо любого UDF. Попробуйте обновленное решение.
Патким

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, "")))}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.