У меня есть разлив данных из нескольких столбцов, в котором некоторая информация отражена неправильно. Мы создали таблицу для поиска, если это одна из неправильных записей. Я хотел бы проверить, существует ли она в списке и извлекает ли она значение. Это работает так, как ожидалось.
Однако, если совпадение не найдено, я просто хочу взять значение, которое уже существует в диапазоне сброса. По сути, я создаю рядом с ним еще один диапазон разлива, где у меня есть либо новые значения, которые мы «перезаписали», либо исходное содержимое.
Моя формула приведена ниже, проблема в той части, где написано 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) )
Фиктивные данные для использования при тестировании
Разве второй столбец выбора не должен быть choosecols( a, 2), поскольку я использую второй столбец?
Нет, вы прочитали мой комментарий полностью, пожалуйста, прочтите его. Он принимает первое вхождение не найдено в массиве, поэтому работает правильно, как и должно вести себя. чтобы это работало для каждой строки, вам нужна такая функция, как BYROW()
Я думаю, мы недопонимаем. Мне под него нужен быров. Вы заканчиваете формулу на CHOOSECOLS(α,-1), и меня немного смущает цифра -1. Если мне нужен второй столбец, когда совпадение не найдено, разве это не должно быть CHOOSECOLS(α,2), поскольку мне нужен второй столбец для этой строки, если я не найду совпадение?
CHOOSECOLS() возвращает весь массив, а не соответствующее значение ячейки. Пожалуйста, попробуйте пустую ячейку! Оба одинаковые CHOOSECOLS(α,2) и CHOOSECOLS(α,-1)

Это должно привести к желаемому результату с помощью функции 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 взаимозаменяемы в окончательной формуле выбора столбцов?
@Метки. Сэр, я использовал -1, вы тоже можете использовать 2, см. обновленные скриншоты, поскольку столбцов всего два, это не имеет никакого значения, оба одинаковые.
@Метки. Сэр, вы мыслите сложно! Оцените свою формулу VLOOKUP() отдельно и сделайте то же самое с XLOOKUP() без использования CHOOSECOLS(), теперь в пустой ячейке используйте CHOOSECOLS(), чтобы увидеть. Ты поймешь!
Кому-то еще интересно: вы можете использовать отрицательные числа для обратного счета от последнего столбца. Спасибо за решение, я не знал, что можно вести обратный отсчет от конца массива, используя отрицательное целое число.
CHOOSECOLS() возвращает массив, поэтому каждый раз выдает первое вхождение для функций поиска. при использовании BYROW() он будет выполнять вычисления для каждой строки!
Да!, я подражаю и покажу вам в комментариях, подождите!
@Метки. Сэр, я разместил скриншоты в ответах, пожалуйста, посмотрите!
Я хотел бы дать этому еще один голос. Мы с коллегой только что обсуждали использование меток столбцов для заполнения полей выбора. Это может сделать мою жизнь намного проще. в следующей версии определенно будет эта настройка
@Метки. Сергей, спасибо большое за добрые слова!! Просто сделал мой день!!
Здесь нет необходимости в LAMBDA; старый добрый ВПР делает свое дело:
=IFNA(VLOOKUP(D2:D13,_Fix,2,0),E2:E13)
Да, но вопрос в том, почему вложенный XLOOKUP [если не найден] не работает должным образом, возвращая несуществующие результаты с точным соответствием.
Это потому, что аргумент IF NOT FOUND ожидает не массив, а одно значение: Попробуйте следующее: =XLOOKUP({4;5;6},_Fix[Code],_Fix[Group],{"A";"B";"C"},0)
Да, это то, что я пытался объяснить ОП, используя XLOOKUP()
Но вместо использования IF(ISERROR и повторения варианта функции поиска можно просто избежать использования IFERROR или IFNA. Более эффективно и лучше поддерживать/понимать.
Я согласен с этим, но я старался придерживаться реальной причины и дать ОП понять, что использование массива с [если не найдено] вернет только первые вхождения. Хотя может быть много способов сделать это, но для определенного контекста потребуется BYROW() с XLOOKUP(), в частности, снова с VLOOKUP() и CHOOSECOLS() + IFNA() мы получим тот же желаемый результат. =IFNA(VLOOKUP(CHOOSECOLS(G2#,1),_Fix,2,0),CHOOSECOLS(G2#,2))
ПРАВДА и хорошо объяснено.
Обратите внимание, что входные данные представляют собой диапазон разлива. Я не уверен, повлияет ли это на ваше решение или формула просто станет =IFNA( VLOOKUP( choosecols(D2#,1),_Fix,2,0),choosecols(D2#,2) )
ПРАВДА, но я не особо понял смысл диапазона разлива, так как диапазон разлива в вашем посте не динамический. Но чем короче (но ведет себя так же): =ifna(VLOOKUP(take(G2#,,1),_Fix,2,0),drop(G2#,,1))
Возможно, это для придания динамики =LET(w,WRAPROWS(TOCOL(D:E,1),2),HSTACK(w,IFNA(VLOOKUP(TAKE(w,,1),_Fix,2,0),DROP(w,,1))))
В моем понимании параметра [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))
сделал бы.
Для этого требуется
BYROW()-->=BYROW(G2#,LAMBDA(α, XLOOKUP(CHOOSECOLS(α,1),_Fix[Code],_Fix[Group],CHOOSECOLS(α,-1)))), когда вы используетеCHOOSECOLS(G2#,2), он не ведет себя неправильно, он работает так, как должен, он возвращает массив для не найденных и принимает первое значение для каждого вхождения