Как посчитать определенные значения между другими значениями

Мне трудно это понять.

У меня есть краткий список чисел в столбце C (от C4 до C19).
Эти числа могут варьироваться от 0 до чего угодно. Никогда не пустует.

В столбце D — дата, в столбце E — смещение, но к задаче это не имеет отношения.

Я хотел бы, чтобы в столбце F было указано нулевое значение перед этой строкой, пока мы не найдем ненулевое значение выше этого.

Итак, скажем F18. Я хочу знать количество нулей в C перед C18. Ответ: 3. Для F17 ответ — 2 (C16 и C15). И так далее.

Я пытался понять это с помощью СЧЁТЕЛЕЙ и ИНДЕКСОВ.... но я запутался.

Покажите, какую формулу вы пробовали, и ожидаемый результат, как вы хотите показать счет. Кстати, пробовали ли вы использовать SCAN() здесь?

Mayukh Bhattacharya 16.04.2024 16:38

Здравствуйте, я не публиковал формулы, потому что, честно говоря, не уверен, чего я пытался добиться. Я не пробовал формулу СКАНИРОВАНИЯ. Стоит отметить одну вещь: мой Excel написан на французском языке, поэтому мне также приходится переводить формулы, что еще больше усложняет мне задачу.

Jessy Saint 16.04.2024 16:41
Сайт-переводчик Я использовал этот, он имеет большинство функций (я использовал голландскую версию, надеюсь, это поможет).
Excellor 16.04.2024 16:44

Похоже, что @Lajos Arpad дал единственный правильный ответ, поскольку он не включает текущую строку при подсчете нулей.

Tom Sharpe 16.04.2024 21:22

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

Jessy Saint 17.04.2024 14:20
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
5
5
148
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Здесь все наоборот (сверху вниз):

=IFERROR(SCAN(0,C4:C19,LAMBDA(a,v,IF(v=0,a+1,0))),"")

Надеюсь, я не нарушаю никаких правил, но вот это на французском:

=SIERREUR(SCAN(0;C4:C19;LAMBDA(a;v;SI(v=0;a+1;0)));"")

ВАУ, спасибо большое. Я перевернул таблицу, не имеет значения, в каком направлении, и все работает отлично! Осталось только перевести.

Jessy Saint 16.04.2024 16:47

@JessySaint добавил перевод, но не уверен, что он точен. К счастью, это всего лишь 3 функции.

Excellor 16.04.2024 16:48

Моя французская и рабочая версия: =SIERREUR(SCAN(0;C4:C19;LAMBDA(a;v;SI(v=0;a+1;0)));"")

Jessy Saint 16.04.2024 16:55

Вот один из способов сделать это, используя SCAN(), как указано в комментариях:


=SCAN(0,C4:C19=0,LAMBDA(x,y,IF(y,x+1,0)))

Пересмотренная формула: Редактировать — 17 апреля 2024 г. -> Благодарность Тому Шарпу Сэру и Лайошу Арпаду Сэр, за то, что они подчеркнули реальную логику.

=DROP(VSTACK(0,SCAN(0,C4:C19=0,LAMBDA(x,y,y*(x+1)))),-1)

Насколько я понимаю, в i-й ячейке столбца F нам нужна длина 0-сегментов в C до (но не включая i-й столбец) до первой ячейки в C, которая либо не равна 0, либо выходит за пределы диапазона. . Если я правильно понимаю, то это ожидаемый результат:

и вы можете добиться этого через

=($C4=0) * $F4 + ($C4=0)

в $F5.

Объяснение:

  • $C4=0 принимает логическое значение и преобразуется в числовое при умножении на что-либо, то есть после преобразования будет 0, если оно было ложным, и 1, если оно было истинным.
  • $F4 — это сумма на данный момент, мы умножаем ее на 1, если у нас был ноль в предыдущей строке, и на 0, если у нас была 1
  • мы добавляем 1, если в строке выше есть 0, и 0, если в строке выше есть 1

Вот решение @Lajos Arpad в виде лямбды (с извинениями):

=LET(data,C4:C19,SCAN(0,SEQUENCE(ROWS(data)),
LAMBDA(a,c,IF(c=1,0,LET(prev,INDEX(data,c-1),a*(prev=0)+(prev=0))))))

Или немного короче

=LET(data,C4:C19,SCAN(0,SEQUENCE(ROWS(data)),
LAMBDA(a,c,IF(c=1,0,LET(prev,INDEX(data,c-1),(a+1)*(prev=0))))))

Бонус: можно ли сделать это без лямбды? Да, например. найдите разницу между номером предыдущей строки и номером последней строки перед текущей, в которой есть ненулевое значение:

=LET(data,C4:C19,s,SEQUENCE(ROWS(data)),fs,FILTER(s,data<>0),s-XLOOKUP(s-1,fs,fs,0,-1,-1)-1)

Том Сэр, оцените ваши выводы. Это всегда помогало учиться. Можно спросить ? Не будет ли это работать согласно изложенной логике --> =DROP(VSTACK(0,SCAN(0,C4:C19=0,LAMBDA(x,y,y*(x+1)))),-1)

Mayukh Bhattacharya 17.04.2024 03:57

Да, это идеально и намного короче.

Tom Sharpe 17.04.2024 09:07

Просто XMATCH развлекаюсь :)

=LAMBDA(_r,
LET(
_next_largest, 0.1,
_comment, CONCAT("Count of values below '", _next_largest, "' in the rows above"),
_above, LAMBDA(_row_index,  INDEX(_r,1,1):INDEX(_r,_row_index-1,1)),
_indices, SEQUENCE(ROWS(_r)),
_offset_to_matched, LAMBDA(_row_index,_matched, _row_index - 1 - _matched),

MAP(_indices, LAMBDA(i,
IF(i = 1, _comment,
IFNA(_offset_to_matched(i, XMATCH(_next_largest, _above(i),1,-1)), "")
)))))(_r)


Или с SCAN,OFFSET и XMATCH:

=LAMBDA(arr, LET(
_next_largest, 0.1,
_comment, CONCAT("Count of values below '", _next_largest, "' in the rows above"),
SCAN(1,SEQUENCE(ROWS(_r)), LAMBDA(a,_row_index,
IF(_row_index = 1, _comment,
IFNA(_row_index - 1 - XMATCH(0.1,OFFSET(_r,0,0,_row_index-1),1,-1), "")
)))))(_r)

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