Это продолжение моего предыдущего вопроса.
@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
Буду признателен за любую оказанную помощь.
Я не уверен, что именно делает формула, но попробуйте следующее:
=ARRAYFORMULA(LAMBDA(res,if (res=E1:E11,,res))(XLOOKUP(D1:D11,A1:A11,B1:B11,,,-1)))
в какую ячейку я должен поместить это: G1? Н1?
если я понял, что вы пытаетесь сделать. Формула повторяет поведение столбца F.
да, но G1, H1 и т. д. содержат условия if (or) и возрастающие косвенные условия Match.
если вы объясните словами, что является желаемым результатом, я посмотрю еще раз.
что все еще не объясняет словами, каков желаемый результат. Что именно делают эти формулы?
Это очень тяжелая таблица! Вы можете попробовать удалить все свои данные в 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))))
Хорошо, некоторые значения этой формулы не совпадают со значениями предыдущих формул. Например, в строке 1 старые формулы генерируют значения до столбца N, а наша новая формула генерирует значения до столбца Q, то же самое происходит в строках 47, 49, 51. Это будет иметь значение в результате в столбце AV
Это связано с тем, что в столбце F есть повторяющиеся значения, присвоенные разным значениям в столбце A. Затем с помощью ПОИСКПОЗ, как вы использовали, в некоторых строках будут ложные совпадения и, возможно, пропущенные значения. Очевидно, что столбец AV будет иметь разные результаты. Просто говорю, что если ваша конечная цель такова и соответствует вашим ожиданиям, вы можете удалить все эти столбцы E: AT и решить все в одной формуле и одном столбце.
так вы говорите, что эта формула генерирует значения с большей точностью, чем предыдущие формулы?
Точно, в строке 1 вы пропустили 3 значения из-за несоответствия
еще раз спасибо, я прошу вас немного объяснить работу этой формулы в вашем ответе (why the result is more accurate than the previous formulas, issue with the previous formulas and how does it work)
. Как новичок, это помогло бы мне узнать об этом и всем, кто хочет добиться того же.
В основном я проверяю каждую строку и фильтрую значения B в соответствии со значениями A. BYROW позволяет мне повторять процесс «строка за строкой». Выражение D1:INDEX(D1:D,COUNTA(D1:D))
на самом деле можно заменить на закрытое значение, например, D1:D1100 или что-то в этом роде. Чего я пытался избежать, так это повторения процесса с 8 тыс. строк, которые у вас были на этом листе. Возвращаясь к формуле, в каждой строке с FILTER «собирает» каждое значение из B, которое соответствует A. С Textjoin я помещаю их все вместе в уникальную ячейку для каждой строки (что нужно BYROW), но затем с помощью ARRAYFORMULA и SPLIT вы в состоянии отделить
Надеюсь более-менее понятно, можно перейти к документации BYROW, FILTER, TEXTJOIN и SPLIT. Важно то, почему я выбрал их. Что касается вашей предыдущей формулы, то она действительно была хороша. Вы справились, чтобы найти значение, а с ПОИСКПОЗОМ и ДВССЫЛ сузить поиск до следующих строк. НО у вас были повторяющиеся значения, не соответствующие разным значениям A. Затем при использовании ПОИСКПОЗ вы не могли видеть, была ли суженная строка правильным значением A или нет, что приводило к несоответствиям и непреднамеренному "скачку" значений. Если бы дубликатов не было, все бы работало нормально!
И снова здравствуйте! Пришлось уйти раньше. Каков ваш ожидаемый результат? Горизонтальный список совпадений от каждого человека? Предыдущий MAP на этот раз не пригодится. Вы не можете создать формулу массива, которая ссылается на ячейки внутри себя. Если вы объясните желаемый результат или логику, мы сможем предоставить вам лучшее решение.