Как найти первую ячейку в строке, где значение не пустое, и проверить, меньше или равно числу в другой ячейке

у меня есть следующая таблица Google:

item  have ready  need1 need2 need3
A     1                 2     1
B     1           2     1     1
C     2                 2     

etc

Я хочу, чтобы заполнить следующим образом:

  • найти первый столбец в need1,..., needN диапазон, который имеет непустое значение
  • если найденное значение меньше или равно значению в

3 ответов


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

ваши вторые два шага довольно просты в любом случае - вы хотите один из двух результатов, основанных на условии, поэтому вы захотите использовать =IF. Ваше условие в том, что "потребность" число меньше или равно числу "иметь", и вы хотите, чтобы оно сказало "Да", если это правда, и ничего, если это не так. Итак, что дает нам:

=IF(need<=have,"Yes","")

в примерах ниже предположим, что ваша таблица выше начинается с ячейки A1 в левом верхнем углу, и что последний столбец в вашем листе Z

Далее нам нужно найти "нужно" и "есть". Найти их довольно легко - это просто число в столбце B.

Поиск "need" немного больше сложный. У вас есть правильная идея, используя INDEX и FILTER, но ваша формула кажется немного перемудрили. В основном мы можем использовать FILTER отфильтровать пустые значения и INDEX чтобы найти первый, который остался. Во-первых, FILTER:

диапазон, который вы хотите отфильтровать, - это все в одной строке от столбца D до столбца Z (или независимо от конечного столбца), и условие, которое вы хотите отфильтровать, заключается в том, что эти же ячейки не пустые. По формуле ты набрав в ячейку C2, что дает нам:

=FILTER(D2:Z2,D2:Z2<>"")

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

=INDEX(FILTER(D2:Z2,D2:Z2<>""),1,1)

или, поскольку у нас есть только одна строка в нашем массиве, и INDEX довольно умная, просто:

=INDEX(FILTER(D2:Z2,D2:Z2<>""),1)

Итак, чтобы принести его все вместе, наша окончательная формула для ячейки С2:

=IF(=INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","")

затем просто перетащите формулу вниз на столько строк, сколько вам нужно. Если ваш лист или становится шире, просто измените Z на любой ваш последний столбец.


когда вы не знаете размер диапазона, используйте функции row, column, rows, columns.


простой формуле

вот пример того, что вы ищете:

=if(INDEX(FILTER(OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1),OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)<>""),1)<=B2,"yes","")

эта часть формулы:

  • OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)

возвращает диапазон, начинающийся с заданной ячейки (D2) до конца листа (COLUMNS(1:1)-column(D2)+1)


ArrayFormula

Я предлагаю использовать ArrayFormula, он будет расширяться автоматически:

=ARRAYFORMULA(if(REGEXEXTRACT(SUBSTITUTE(trim(transpose(query(transpose(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)),,COLUMNS(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)))))," ",", "),"\d+")*1<=OFFSET(B2,,,COUNTA(A2:A)),"yes",""))

предполагается, что столбец "Item" не имеет пустых значений.


решение от @Max Makhrov работает и имеет преимущество использования одной формулы для всей колонки. Однако предполагается, что все ваши столбцы справа от вашего ready столбец (D) будет need_ столбцы.

решение от @dmusgrave также работает, если вы удалите дополнительный " = " перед INDEX: =IF(INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes",""). Однако он делает то же предположение, а также ограничивает столбец Z.

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

=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:,4)="need")))&row() )<>""),1)<=B2,"Yes","")

идея просто заменить D2:Z2 (в решении @dmusgrave) по :

INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() )

объяснение: вы начинаете С D в текущей строке, и вы идете до последнего need_ столбец в той же текущей строке. CHAR(68) и D, к которому вы добавляете количество столбцов под названием need.* минус один (отсюда и 67).

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