Фурмули багатоклітинного масиву, вкладені


0

Мої дані є в перших двох таблицях ( 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, якщо Array повертається з IF. Я думаю, це тому, що отримана довжина двох масивів не відповідає поверненню # N / A для надлишку, і це притягує всю формулу до # N / A. Дивіться цей знімок екрана нижче.

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

Це привело мене до створення дуже базового UDF у VBA, який повертає лише потрібний масив. У цьому АДС не існує багато перевірок. Переконайтесь, що на нього передано лише посилання на один стовпець, а очікувані значення повернення існують у самій сусідній колонці праворуч. наприклад, якщо ви передасте A1: A4, він перевірить значення в B1: B4.

Натисніть ALT+, F11щоб отримати доступ до редактора VBA, Вставити -> Модуль і вставте в нього наступний код.

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

Ми будемо використовувати цей АДС в остаточному вирішенні. наприклад, щоб отримати масив стовпця B, де A є H1, використовуйте цю формулу як=RetArray(A1:A6,H1)

Наступна хитра частина - це зіставити це повернене значення в точне місце на стовпці Е та отримати значення від D.

Спочатку створіть стовпчик помічників на C, який є об'єднанням наукових досліджень

Формула в C1 є =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, посилання піде не так, якщо ви не маніпулюєте тим самим, використовуючи попереднє посилання на рядок. Спробуйте спробувати повернутися назад. Також перевіряйте на розумніші рішення інших користувачів.

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

Оновлення

Я розумію, що в той час, як постійні масиви працювали, а довідка комірок не робила (що приводило мене до створення 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 замість будь-якого АДС. Спробуйте оновлене рішення.
патким

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 не можна використовувати, MIN знаходить останню.

Перевірте знімок екрана ,,

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

Формула така,

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

Навіть формула Non-Array вирішила це питання.

Примітка: формулу можна переробити за допомогою діапазону даних.

Я опублікував рішення після того, як я перевірив мене, на випадок, якщо він відрізняється, будь ласка, просто прокоментуйте.


0

З невеликою корекцією я приніс рішення , яке знаходить пізню дату тільки в межах необхідної зони, фільтри дані з використанням критерію є, A і Code1, Кодекса2 Або 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.