Примените сложную формулу ко всему столбцу, используя MAP или ARRAY FORMULA

Это продолжение моего предыдущего вопроса.

@Martin и @rockinfreakshow помогли мне преобразовать следующую формулу, используя MAP и BYROW соответственно.

Формула до преобразования в ячейке F1:

=if (Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(E1,$B:$B,0)+1&":$B"),2,false),"")=E1,"",Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(E1,$B:$B,0)+1&":$B"),2,false),""))

Решение формулы в ячейке F1:

=MAP(D:D,E:E,LAMBDA(d,e,IFERROR(IF(d = "","",INDEX(FILTER(B:B,A:A=d,ROW(B:B)>MATCH(e,B:B,0)),1))))) 

Поскольку я ожидал, что решение будет ARRAYFORMULA обертыванием, и я сам преобразую следующую формулу, но это не так. Поэтому я ищу вашу помощь, чтобы преобразовать их:

Формула в ячейке G1:

=if (or(Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(F1,$B:$B,0)+1&":$B"),2,false),"")=E1,Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(F1,$B:$B,0)+1&":$B"),2,false),"")=F1)
,"",Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(F1,$B:$B,0)+1&":$B"),2,false),""))

и

Формула в ячейке H1:

=if (or(Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(G1,$B:$B,0)+1&":$B"),2,false),"")=E1,Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(G1,$B:$B,0)+1&":$B"),2,false),"")=F1,Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(G1,$B:$B,0)+1&":$B"),2,false),"")=G1)
,"",Iferror(vlookup($D1, INDIRECT("$"&"A"&MATCH(G1,$B:$B,0)+1&":$B"),2,false),""))

Теперь я ожидаю, что если мы сможем найти решение для формул G1, H1, я смогу воспроизвести его для формул в других ячейках I1,J1,K1..

Я связал лист для вашего тестирования: https://docs.google.com/spreadsheets/d/13XLZvvdzK_mqr4Ous50cIEfernw2XrPJWvVgt1hFxtk/edit?usp=sharing

Буду признателен за любую оказанную помощь.

И снова здравствуйте! Пришлось уйти раньше. Каков ваш ожидаемый результат? Горизонтальный список совпадений от каждого человека? Предыдущий MAP на этот раз не пригодится. Вы не можете создать формулу массива, которая ссылается на ячейки внутри себя. Если вы объясните желаемый результат или логику, мы сможем предоставить вам лучшее решение.

Martín 25.01.2023 05:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что именно делает формула, но попробуйте следующее:

=ARRAYFORMULA(LAMBDA(res,if (res=E1:E11,,res))(XLOOKUP(D1:D11,A1:A11,B1:B11,,,-1)))

в какую ячейку я должен поместить это: G1? Н1?

EagleEye 25.01.2023 04:55

если я понял, что вы пытаетесь сделать. Формула повторяет поведение столбца F.

ztiaa 25.01.2023 04:56

да, но G1, H1 и т. д. содержат условия if (or) и возрастающие косвенные условия Match.

EagleEye 25.01.2023 04:58

если вы объясните словами, что является желаемым результатом, я посмотрю еще раз.

ztiaa 25.01.2023 05:00

что все еще не объясняет словами, каков желаемый результат. Что именно делают эти формулы?

ztiaa 25.01.2023 05:07
Ответ принят как подходящий

Это очень тяжелая таблица! Вы можете попробовать удалить все свои данные в E:AU и использовать эту формулу:

=ARRAYFORMULA(IFERROR (SPLIT(BYROW(D1:INDEX(D1:D,COUNTA(D1:D)),LAMBDA(v,TEXTJOIN(",",,FILTER(B:B,A:A=v)))),",")))

Он объединяет отфильтрованные значения в каждой строке, а затем разбивает их на нужные столбцы.

Снова разглядывал. Если ваша конечная цель — достичь результата в AV, вы можете отбросить все E:AT и использовать: =BYROW(D1:INDEX(D1:D,COUNTA(D1:D)),LAMBDA(v, CONCATENATE (FILTER(B:B,A:A=v))))

Martín 25.01.2023 06:16

Хорошо, некоторые значения этой формулы не совпадают со значениями предыдущих формул. Например, в строке 1 старые формулы генерируют значения до столбца N, а наша новая формула генерирует значения до столбца Q, то же самое происходит в строках 47, 49, 51. Это будет иметь значение в результате в столбце AV

EagleEye 25.01.2023 06:20

Это связано с тем, что в столбце F есть повторяющиеся значения, присвоенные разным значениям в столбце A. Затем с помощью ПОИСКПОЗ, как вы использовали, в некоторых строках будут ложные совпадения и, возможно, пропущенные значения. Очевидно, что столбец AV будет иметь разные результаты. Просто говорю, что если ваша конечная цель такова и соответствует вашим ожиданиям, вы можете удалить все эти столбцы E: AT и решить все в одной формуле и одном столбце.

Martín 25.01.2023 06:24

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

EagleEye 25.01.2023 06:31

Точно, в строке 1 вы пропустили 3 значения из-за несоответствия

Martín 25.01.2023 06:32

еще раз спасибо, я прошу вас немного объяснить работу этой формулы в вашем ответе (why the result is more accurate than the previous formulas, issue with the previous formulas and how does it work). Как новичок, это помогло бы мне узнать об этом и всем, кто хочет добиться того же.

EagleEye 25.01.2023 10:59

В основном я проверяю каждую строку и фильтрую значения B в соответствии со значениями A. BYROW позволяет мне повторять процесс «строка за строкой». Выражение D1:INDEX(D1:D,COUNTA(D1:D)) на самом деле можно заменить на закрытое значение, например, D1:D1100 или что-то в этом роде. Чего я пытался избежать, так это повторения процесса с 8 тыс. строк, которые у вас были на этом листе. Возвращаясь к формуле, в каждой строке с FILTER «собирает» каждое значение из B, которое соответствует A. С Textjoin я помещаю их все вместе в уникальную ячейку для каждой строки (что нужно BYROW), но затем с помощью ARRAYFORMULA и SPLIT вы в состоянии отделить

Martín 25.01.2023 11:05

Надеюсь более-менее понятно, можно перейти к документации BYROW, FILTER, TEXTJOIN и SPLIT. Важно то, почему я выбрал их. Что касается вашей предыдущей формулы, то она действительно была хороша. Вы справились, чтобы найти значение, а с ПОИСКПОЗОМ и ДВССЫЛ сузить поиск до следующих строк. НО у вас были повторяющиеся значения, не соответствующие разным значениям A. Затем при использовании ПОИСКПОЗ вы не могли видеть, была ли суженная строка правильным значением A или нет, что приводило к несоответствиям и непреднамеренному "скачку" значений. Если бы дубликатов не было, все бы работало нормально!

Martín 25.01.2023 11:08

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