Вложенный Xlookup [если не найден] не работает должным образом, возвращая несуществующие результаты с точным соответствием

У меня есть разлив данных из нескольких столбцов, в котором некоторая информация отражена неправильно. Мы создали таблицу для поиска, если это одна из неправильных записей. Я хотел бы проверить, существует ли она в списке и извлекает ли она значение. Это работает так, как ожидалось.

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

Моя формула приведена ниже, проблема в той части, где написано CHOOSECOLS(G2#,2), но проверяется так, как если бы она соответствовала последнему коду:

=XLOOKUP( CHOOSECOLS(G2#,1),_Fix[Code],_Fix[Group], CHOOSECOLS(G2#,2),0)

Я решил это, используя приведенную ниже формулу, но мне больше любопытно, почему условие [если не найдено] не срабатывает должным образом, несмотря на условие точного соответствия.

=IF( ISERROR( VLOOKUP( CHOOSECOLS(G2#,1),_Fix,2,0) ) , CHOOSECOLS(G2#,2), XLOOKUP( CHOOSECOLS(G2#,1),_Fix[Code],_Fix[Group],0,0) )

Фиктивные данные для использования при тестировании

Код Группа 1 Неоплачиваемый 1 Неоплачиваемый 4 Админ 5 Админ 1 Неоплачиваемый 2 Неоплачиваемый 2 Неоплачиваемый 3 Админ 4 Админ 5 Админ 4 Админ 1 Неоплачиваемый
Код Группа 1 подлежащий оплате 2 подлежащий оплате 3 Неоплачиваемый

Для этого требуется BYROW() --> =BYROW(G2#,LAMBDA(α, XLOOKUP(CHOOSECOLS(α,1),_Fix[Code],_Fix[Group],CHOOSECOLS(α,‌​-1)))), когда вы используете CHOOSECOLS(G2#,2), он не ведет себя неправильно, он работает так, как должен, он возвращает массив для не найденных и принимает первое значение для каждого вхождения

Mayukh Bhattacharya 13.06.2024 22:47

Разве второй столбец выбора не должен быть choosecols( a, 2), поскольку я использую второй столбец?

Mark S. 13.06.2024 22:48

Нет, вы прочитали мой комментарий полностью, пожалуйста, прочтите его. Он принимает первое вхождение не найдено в массиве, поэтому работает правильно, как и должно вести себя. чтобы это работало для каждой строки, вам нужна такая функция, как BYROW()

Mayukh Bhattacharya 13.06.2024 22:49

Я думаю, мы недопонимаем. Мне под него нужен быров. Вы заканчиваете формулу на CHOOSECOLS(α,-1), и меня немного смущает цифра -1. Если мне нужен второй столбец, когда совпадение не найдено, разве это не должно быть CHOOSECOLS(α,2), поскольку мне нужен второй столбец для этой строки, если я не найду совпадение?

Mark S. 13.06.2024 22:51
CHOOSECOLS() возвращает весь массив, а не соответствующее значение ячейки. Пожалуйста, попробуйте пустую ячейку! Оба одинаковые CHOOSECOLS(α,2) и CHOOSECOLS(α,-1)
Mayukh Bhattacharya 13.06.2024 22:51
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
5
119
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это должно привести к желаемому результату с помощью функции BYROW():

=BYROW(G2#,LAMBDA(α, 
 XLOOKUP(CHOOSECOLS(α,1),_Fix[Code],_Fix[Group],
 CHOOSECOLS(α,-1))))


=BYROW(G2#,LAMBDA(α, 
     XLOOKUP(CHOOSECOLS(α,1),_Fix[Code],_Fix[Group],
     CHOOSECOLS(α,2))))

Вот фиктивные данные, показывающие использование CHOOSECOLS() с числами -ve для получения обратных столбцов:


• Регулярное использование:

=CHOOSECOLS(B3:E15,G2:J2)

• Чтобы получить обратные столбцы:

=CHOOSECOLS(B3:E15,L2:O2)

Можете ли вы объяснить, почему -1 и 2 взаимозаменяемы в окончательной формуле выбора столбцов?

Mark S. 13.06.2024 22:53

@Метки. Сэр, я использовал -1, вы тоже можете использовать 2, см. обновленные скриншоты, поскольку столбцов всего два, это не имеет никакого значения, оба одинаковые.

Mayukh Bhattacharya 13.06.2024 22:54

@Метки. Сэр, вы мыслите сложно! Оцените свою формулу VLOOKUP() отдельно и сделайте то же самое с XLOOKUP() без использования CHOOSECOLS(), теперь в пустой ячейке используйте CHOOSECOLS(), чтобы увидеть. Ты поймешь!

Mayukh Bhattacharya 13.06.2024 22:56

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

Mark S. 13.06.2024 22:56
CHOOSECOLS() возвращает массив, поэтому каждый раз выдает первое вхождение для функций поиска. при использовании BYROW() он будет выполнять вычисления для каждой строки!
Mayukh Bhattacharya 13.06.2024 22:57

Да!, я подражаю и покажу вам в комментариях, подождите!

Mayukh Bhattacharya 13.06.2024 22:57

@Метки. Сэр, я разместил скриншоты в ответах, пожалуйста, посмотрите!

Mayukh Bhattacharya 13.06.2024 23:02

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

Mark S. 13.06.2024 23:07

@Метки. Сергей, спасибо большое за добрые слова!! Просто сделал мой день!!

Mayukh Bhattacharya 13.06.2024 23:08

Здесь нет необходимости в LAMBDA; старый добрый ВПР делает свое дело:

=IFNA(VLOOKUP(D2:D13,_Fix,2,0),E2:E13)

Да, но вопрос в том, почему вложенный XLOOKUP [если не найден] не работает должным образом, возвращая несуществующие результаты с точным соответствием.

Mayukh Bhattacharya 13.06.2024 23:24

Это потому, что аргумент IF NOT FOUND ожидает не массив, а одно значение: Попробуйте следующее: =XLOOKUP({4;5;6},_Fix[Code],_Fix[Group],{"A";"B";"C"},0)

P.b 13.06.2024 23:31

Да, это то, что я пытался объяснить ОП, используя XLOOKUP()

Mayukh Bhattacharya 13.06.2024 23:32

Но вместо использования IF(ISERROR и повторения варианта функции поиска можно просто избежать использования IFERROR или IFNA. Более эффективно и лучше поддерживать/понимать.

P.b 13.06.2024 23:33

Я согласен с этим, но я старался придерживаться реальной причины и дать ОП понять, что использование массива с [если не найдено] вернет только первые вхождения. Хотя может быть много способов сделать это, но для определенного контекста потребуется BYROW() с XLOOKUP(), в частности, снова с VLOOKUP() и CHOOSECOLS() + IFNA() мы получим тот же желаемый результат. =IFNA(VLOOKUP(CHOOSECOLS(G2#,1),_Fix,2,0),CHOOSECOLS(G2#,2))

Mayukh Bhattacharya 13.06.2024 23:36

ПРАВДА и хорошо объяснено.

P.b 13.06.2024 23:37

Обратите внимание, что входные данные представляют собой диапазон разлива. Я не уверен, повлияет ли это на ваше решение или формула просто станет =IFNA( VLOOKUP( choosecols(D2#,1),_Fix,2,0),choosecols(D2#,2) )

Mark S. 14.06.2024 21:32

ПРАВДА, но я не особо понял смысл диапазона разлива, так как диапазон разлива в вашем посте не динамический. Но чем короче (но ведет себя так же): =ifna(VLOOKUP(take(G2#,,1),_Fix,2,0),drop(G2#,,1))

P.b 14.06.2024 21:46

Возможно, это для придания динамики =LET(w,WRAPROWS(TOCOL(D:E,1),2),HSTACK(w,IFNA(VLOOKUP(TAKE(w‌​,,1),_Fix,2,0),DROP(‌​w,,1))))

P.b 14.06.2024 21:56

В моем понимании параметра [if_not_found]XLOOKUP ожидается скалярное значение:

[если_не_найден]

Если действительное совпадение не найдено, верните предоставленный вами текст [if_not_found].

Если действительное совпадение не найдено и [if_not_found] отсутствует, возвращается #N/A.

Итак, как и у P.b.,

=IFNA(
XLOOKUP(CHOOSECOLS(G2#,1), _Fix[Code], _Fix[Group], , 0),
CHOOSECOLS(G2#, 2))

сделал бы.

Другие вопросы по теме