Мне трудно это понять.
У меня есть краткий список чисел в столбце C (от C4
до C19
).
Эти числа могут варьироваться от 0 до чего угодно. Никогда не пустует.
В столбце D — дата, в столбце E — смещение, но к задаче это не имеет отношения.
Я хотел бы, чтобы в столбце F было указано нулевое значение перед этой строкой, пока мы не найдем ненулевое значение выше этого.
Итак, скажем F18
. Я хочу знать количество нулей в C перед C18
. Ответ: 3.
Для F17 ответ — 2 (C16
и C15
).
И так далее.
Я пытался понять это с помощью СЧЁТЕЛЕЙ и ИНДЕКСОВ.... но я запутался.
Здравствуйте, я не публиковал формулы, потому что, честно говоря, не уверен, чего я пытался добиться. Я не пробовал формулу СКАНИРОВАНИЯ. Стоит отметить одну вещь: мой Excel написан на французском языке, поэтому мне также приходится переводить формулы, что еще больше усложняет мне задачу.
Похоже, что @Lajos Arpad дал единственный правильный ответ, поскольку он не включает текущую строку при подсчете нулей.
@TomSharpe, ты абсолютно прав. Но впоследствии я понял, что для своего приложения я предпочитаю использовать текущую строку, потому что это своего рода проекция на текущий день. Я, наверное, сначала об этом не подумал.
Здесь все наоборот (сверху вниз):
=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)));"")
ВАУ, спасибо большое. Я перевернул таблицу, не имеет значения, в каком направлении, и все работает отлично! Осталось только перевести.
@JessySaint добавил перевод, но не уверен, что он точен. К счастью, это всего лишь 3 функции.
Моя французская и рабочая версия: =SIERREUR(SCAN(0;C4:C19;LAMBDA(a;v;SI(v=0;a+1;0)));"")
Вот один из способов сделать это, используя 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Вот решение @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)
Да, это идеально и намного короче.
Просто 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)
Покажите, какую формулу вы пробовали, и ожидаемый результат, как вы хотите показать счет. Кстати, пробовали ли вы использовать
SCAN()
здесь?