Можно ли упростить эти формулы?Почему функция INDIRECT не работает внутри теста ISBLANK в формуле MATCH? - PullRequest
0 голосов
/ 29 января 2019

Сводка

Мне нужна формула массива, которая берет строку данных определенной длины из Sheet1.Для этой строки в каждом непустом столбце мне нужно получить значение заголовка Sheet1 для этого столбца и отобразить эти данные в виде непрерывной строки на Sheet2 (без пробелов между ячейками строки).

Справочная информация

У меня есть таблица данных (сотрудники и отраслевые сертификаты с датой истечения срока действия, являющейся данными ячейки таблицы) на листе 1, со строкой для каждого сотрудника, которую отслеживает электронная таблица.Сертификаты - это столбцы.

Мы используем эту информацию для связи с программным обеспечением ID Badge Printer (Bodno Silver), где мы ограничены привязкой столбцов данных к определенному текстовому полю.

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

Что я сделал

Мое решение для этого (которое я открыт для лучшего, если кто-то знает, кроме как «использовать лучшее программное обеспечение»") должен был создать новые формулы для листов и массивов, которые никто не использовал бы, кроме меня и программного обеспечения принтера id.На этом листе будет аналогичная таблица данных, в которой строки данных, чередующиеся с пустыми ячейками между датами истечения срока действия, помещаются в соответствующие заголовки столбцов для ячеек, в которых есть дата, в непрерывную строку одинаковой максимальной длины (исключая пустые ячейки).).

По сути, это позволило бы мне обойти ограничения программного обеспечения для значков, и каждое текстовое поле было бы MatchedCert1, MatchedCert2, MatchedCert3 и т. Д. Вплоть до исходного максимального количества сертификатов.

Картинки, вероятно, лучше моих слов при объяснении того, для чего я иду:

Лист1 (источник)

Sheet1

Лист2 (результат)

Sheet2

Формулы массива

Я некоторое время работал над этим.То, что я думал, было бы простой формулой INDEX, MATCH, ISBLANK (которую я мог бы создать, используя соответствующие относительные и абсолютные ссылки на ячейки), а затем расширить до целого листа, превращенного в охоту на ведьм, и я молился о прощении своих грехов всем этимможет быть святымТакже много гуглят .... Я быстро понял, что этот может быть не таким уж простым.

Наконец, я пришел к следующим двум формулам массива, чтобы правильно показать, к чему я стремился:

Первый столбец учебного раздела

{=IFERROR(INDEX(Sheet1!$E$2:$P3,1,MATCH(FALSE,ISBLANK(Sheet1!E3:Q3),0)),"")}

(достаточно легко, правда? Я так думал ...)

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

Я чувствую себя грязно, просто публикуя следующее, но здесь все идет ...

Второй столбец в формуле массива последнего столбца

{=IFNA(INDEX(INDIRECT(ADDRESS(ROW($E$2),(MATCH(E3,Sheet1!$2:$2,0)+1),1,1, "Sheet1")&":"&ADDRESS(ROW(E3),COLUMN($Q3),1)),1,MATCH(FALSE, ISBLANK(INDEX(INDIRECT("Sheet1!"&ADDRESS(ROW(E3),(MATCH(E3,Sheet1!$2:$2,0)+1),1)&":"&ADDRESS(ROW(E3),COLUMN($Q3),1)),0,0)), 0)),"")}

(пожалуйста, не звоните в полицию ...)

[редактирование ниндзя] Хотя эта формула массива работает для 2-го столбца результата до последнегостолбец, он не работает, если после результирующего диапазона нет пустого столбца.Настоящая электронная таблица имеет 4 различных группы сертификатов, которые проходят горизонтально, но я смог достаточно просто добавить пустой столбец в соответствующие данные с другого листа, поэтому я просто отпустил его.Я бы дал кому-нибудь прозвище для ответа на вопрос, почему это также имеет место здесь [/ edit]

Results

Первая формула массива и INDEX MATCH с использованием ISBLANK довольно просты.

Самый большой вопрос для меня здесь, и то, что сводило меня с ума на пару дней, заключается в том, почему для второй формулы массива требуется дополнительная функция INDEX, вложенная в функцию ISBLANK.

Разбирая функцию и экспериментируя, я понял, что если у меня есть какая-либо НЕПРАВИЛЬНАЯ ссылка внутри функции ISBLANK, которая сама находится внутри функции MATCH, результат совпадения будет ВСЕГДА 1:

{=MATCH(FALSE,ISBLANK(INDIRECT("$E3:$Q3")), 0)}

Приведенный выше ВСЕГДА возвращает 1, тогда как, если я явно укажу диапазон, функция будет работать нормально .Это не вариант для меня, поскольку мне нужно было динамически возвращать начальную позицию для совпадения, используя адрес предыдущей ячейки.

Однако добавление функции INDEX (со значением столбца и строки0) инкапсулировать функцию INDIRECT дает правильный ответ.Я понял это только методом проб и ошибок.

Вопросы

Может кто-то с большим знанием, пожалуйста, дайте мне знать, что вызывает такое поведение?

В качестве более широкого вопроса, учитывая, что я ограничен использованием формул (без VBA), я также хотел бы знать, правильно ли я поступаю по этому поводу или существует ли гораздо более простой способ выполненияэто без этого бегемота формулы?

Я знаю, что этот лист, вероятно, потребует обслуживания через год - удачи будущему самому!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Не решение, но ответить на вопрос, почему вы видите такое поведение:

РЕДАКТИРОВАТЬ: ПРЕДЫДУЩЕЕ ОБЪЯСНЕНИЕ ПРОСТО НЕПРАВИЛЬНО НЕПРАВИЛЬНО

Это смутило меня, поэтому я провел небольшое исследование:

enter image description here

Я думаю, что ваша проблема на самом деле исходит от функции ISBLANK, потому что она предназначена для использования с отдельными значениями и не может обрабатывать диапазоны.Любые пустые значения, которые возвращаются функциями, преобразуются только в числовые значения (0), когда пустые значения возвращаются (или отображаются на) листе.Если функция возвращается к другой функции, значение BLANK кажется сохраненным.

РЕДАКТИРОВАНИЕ: ДОБАВЛЕНИЕ РЕШЕНИЯ БЕЗ ФОРМУЛОВ Массива

Это, вероятно, более сложно, чем использование формулы массива ...но я сильно не люблю их, поэтому делаю все возможное, чтобы удалить их.

Во-первых, я бы добавил индекс к вашим позициям в таблице результатов:

enter image description here

=IF(F$7>COUNTIFS($F3:$L3,"<>"),
    "",
    IF(
        MINIFS(
            $F$7:$L$7,$F$7:$L$7,
            ">" & IFNA(INDEX($F$7:$L$7,MATCH(E9,$F$2:$L$2,0)),0),
            $F3:$L3,
            "<>"
        )=0,
        "",
        INDEX(
            $F$2:$L$2,
            MATCH(
                MINIFS(
                    $F$7:$L$7,$F$7:$L$7,
                    ">" & IFNA(INDEX($F$7:$L$7,MATCH(E9,$F$2:$L$2,0)),0),
                    $F3:$L3,
                    "<>"
                ),
                $F$7:$L$7,
                0
            )
        )
    )
)

По сути, формула просматривает сертификат в предыдущей ячейке и ищет следующий минимальный индекс, превышающий этот.

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

Поместите это в E3, Копируйте снова и вниз

=IFERROR(INDEX(Sheet1!$2:$2,AGGREGATE(15,6,COLUMN(INDEX($E:$P,MATCH($C3,Sheet1!$C:$C,0),0))/(INDEX(Sheet1!$E:$P,MATCH($C3,Sheet1!$C:$C,0),0)<>""),COLUMN(A:A))),"")

Что касается того, почему ваша формула не работает, она слишком сложна для анализа.Одно замечание: если листы не являются переменными, следует избегать НЕПОСРЕДСТВЕННОГО, насколько это возможно.INDEX почти всегда может использоваться вместо него.

И INDIRECT, и ADDRESS являются энергозависимыми функциями.Изменчивые функции будут пересчитываться каждый раз, когда Excel пересчитывает, что приводит к большому количеству ненужных вычислений.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...