1

У меня есть список температур от датчика, который включает значения сброса нуля, когда датчик выключен.

A       B       C
res      0
tmp   20,5
tmp   20,3
res      0
tmp   20,4
tmp   20,1
tmp   20,2
res      0
res      0
tmp   20,6

Я могу найти такие строки по следующей формуле и получить значение от B , который равен нулю:

=INDEX(B1:10,MATCH("res",A1:A10,0))

Но это не приносит мне никакой пользы. Я хотел бы, чтобы формула нашла строку с res в A а затем заглянула в столбец B и нашла первое ненулевое значение либо выше, либо ниже, если такая строка не может быть найдена, например, для A1 .

Поэтому мои данные должны выглядеть так:

A       B       C
res      0    20,5
tmp   20,5    20,5
tmp   20,3    20,3
res      0    20,3
tmp   20,4    20,4
tmp   20,1    20,1
tmp   20,2    20,2
res      0    20,2
res      0    20,2
tmp   20,6    20,6

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

2 ответа2

0

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

Скриншот рабочего листа

Введите следующую формулу в C1 и ctrl-enter/copy-paste/fill-down/auto-fill в оставшуюся часть столбца таблицы:

=
INDEX(
  (B:B),
  IFERROR(
    1/(1/SUMPRODUCT(LARGE(ROW(A$1:A1)*(A$1:A1<>"res"),1))),
    ROW()-1+MATCH("tmp",A1:INDEX(A:A,ROWS(A:A)),0)
  )
)


Объяснение:

Функция LARGE(ROW(A$1:A1)*(A$1:A1<>"res"),1) используется для возврата наибольшего номера строки (т. Е. Ближайшей) res строки от текущей строки вверх. (SUMPRODUCT() инкапсулирующий его, предназначен для того, чтобы гарантировать, что внутренние диапазоны будут оцениваться как массивы, не требуя ввода формулы в массив.) Если нет такого не- res строк, SUMPRODUCT(LARGE(…)) значение 0

Для ненулевого значения, IFERROR(1/(1/value),expression) вычисляет значение (то есть ближе всего вверх не- res номер строка). При нулевом значении он оценивается как результат выражения (так как 1/(1/0)) приводит к #DIV/0! ошибка).

Таким образом, для каждого последовательного значения сброса, начиная с первой строки, оценивается ROW()-1+MATCH("tmp",A1:INDEX(A:A,ROWS(A:A)),0) . Это просто возвращает номер строки первого ряда, начиная с текущего ряда и далее, что является допустимым показанием температуры. ( A1:INDEX(A:A,ROWS(A:A)) - это просто диапазон от ячейки в столбце A соответствующей текущей строке, то есть A1 для формулы, введенной в C1 , до последней ячейки столбца A , INDEX(A:A,ROWS(A:A)) .)

Наконец, мы заканчиваем INDEX((B:B),row_number) который извлекает соответствующие показания температуры.


Пройдя по формуле в C10 следует прояснить вышесказанное:

  • ROW(A$1:A10)*(A$1:A10<>"res")
    {1;2;3;4;5;6;7;8;9;10}*({"res";"res";"tmp";"tmp";"res";"tmp";"tmp";"tmp";"res";"res"}<>"res")
    {1;2;3;4;5;6;7;8;9;10}*{FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;FALSE;FALSE}
    {1;2;3;4;5;6;7;8;9;10}*{0;0;1;1;0;1;1;1;0;0}
    {0;0;3;4;0;6;7;8;0;0}
  • 1/(1/SUMPRODUCT(LARGE({0;0;3;4;0;6;7;8;0;0},1)))
    1/(1/SUMPRODUCT(8)) (поскольку LARGE() возвращает n-е наибольшее значение, где n - второй аргумент) → 1/(1/8)
    1/0.125
    8
  • =INDEX((B:B),IFERROR(8,…))
    =INDEX(B:B,8)
    =20,2


Заметки:

  • Многострочная, предварительно проверенная формула фактически работает, введенная как есть.
  • Скобки вокруг (B:B) требуются только для того, чтобы заставить B:B оставаться на своей линии.


Если вам нужна более простая формула, вам нужно использовать вспомогательный столбец (D):

Скриншот рабочего листа

Введите следующую формулу в C1 и ctrl-enter/copy-paste/fill-down/auto-fill в оставшуюся часть столбца таблицы:

=IF(A1="res",IF(ROW()=1,D1,INDEX(C:C,ROW()-1)),B1)

Введите следующую формулу в D1 и ctrl-enter/copy-paste/fill-down/auto-fill в оставшуюся часть столбца таблицы:

=IF(A1="res",D2,B1)


Объяснение:

  • Вспомогательная колонка:

    • Если текущая строка содержит значение сброса, формула в столбце D копирует значение из ячейки непосредственно ниже.
    • В противном случае он получает значение из той же строки столбца B
    • Работая от последней строки данных в столбце вверх, это приводит к оценке D1 до первого действительного значения в столбце B
  • Основная колонка:

    • Для строки сброса формула в столбце C проверяет, находится ли она в первой строке, и в этом случае она использует значение из ячейки столбца D соответствующее той же строке, то есть D1 . Если формула находится в любой другой строке столбца C , она получает значение из ячейки, расположенной непосредственно выше.
    • Если строка является допустимой строкой температуры, формула получает показания температуры из ячейки в столбце B соответствующем той же строке.
0

Вы можете просто найти "res" и взять значение выше.
Даже если есть несколько нулевых значений, они должны указывать на значение выше, которое не равно нулю, так как мы только что изменили его.

Так в С1

=B1

Тогда С2

=IF(A2<>"res",B2,C1)

И заполнить вниз.
Это будет работать до тех пор, пока B1 не равен 0.
Вы также можете добавить формулу, чтобы позаботиться об этом, но, поскольку это одна ячейка, я думаю, что проще проверить ее вручную, поскольку вы помещаете другую формулу рядом с ней.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .