Se você deseja permitir qualquer número de reconfigurações no início dos dados e não usar colunas auxiliares, a fórmula é um pouco complicado:
InsiraaseguintefórmulaemC1
ectrl-enter/copy-paste/fill-down/preenchimentoautomáticonorestantedacolunadatabela:
=
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)
)
)
Explicação:
A função LARGE(ROW(A$1:A1)*(A$1:A1<>"res"),1)
é usada para retornar o maior número de linha (ou seja, mais próximo) que não seja res
row, da linha atual para cima. (O SUMPRODUCT()
encapsulando está ali apenas para garantir que os intervalos dentro sejam avaliados como matrizes, sem exigir que a fórmula seja inserida na matriz.) Se houver não , essas linhas que não são res
, SUMPRODUCT(LARGE(…))
avalia para 0
.
Para um valor diferente de zero , IFERROR(1/(1/value),expression)
é avaliado como valor (ou seja, o número de linha ascendente não superior a res
). Para um valor zero , ele é avaliado pelo resultado expressão (porque 1/(1/0))
resulta em um erro #DIV/0!
).
Assim, para cada valor de reinicialização consecutivo a partir da primeira linha, ROW()-1+MATCH("tmp",A1:INDEX(A:A,ROWS(A:A)),0)
é avaliado. Isso simplesmente retorna o número da linha da primeira linha, da linha atual para baixo, que é uma leitura de temperatura válida. ( A1:INDEX(A:A,ROWS(A:A))
é simplesmente o intervalo da célula na coluna A
correspondente à linha atual, ou seja, A1
para a fórmula inserida em C1
, até a última célula da coluna A
, INDEX(A:A,ROWS(A:A))
.)
Finalmente, acabamos com INDEX((B:B),row_number)
, que extrai a leitura de temperatura apropriada.
Percorrer a fórmula em C10
deve tornar o acima mais claro:
-
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))
(poisLARGE()
retorna o n-ésimo maior valor, onde n é o segundo argumento) →1/(1/8)
→1/0.125
→8
-
=INDEX((B:B),IFERROR(8,…))
→=INDEX(B:B,8)
→=20,2
Notas:
- A fórmula multi-linha, prettificada, realmente funciona como está.
- Os parênteses em torno de
(B:B)
são necessários apenas para forçar oB:B
a permanecer em sua própria linha.
Se você quiser uma fórmula mais simples, então você precisa usar uma coluna auxiliar ( D
):
InsiraaseguintefórmulaemC1
ectrl-enter/copy-paste/fill-down/preenchimentoautomáticonorestantedacolunadatabela:
=IF(A1="res",IF(ROW()=1,D1,INDEX(C:C,ROW()-1)),B1)
Insira a seguinte fórmula em D1
e ctrl-enter / copy-paste / fill-down / preenchimento automático no restante da coluna da tabela:
=IF(A1="res",D2,B1)
Explicação:
-
coluna auxiliar:
- Se a linha atual contiver um valor de redefinição, a fórmula na coluna
D
copia o valor da célula diretamente abaixo. - Caso contrário, ele pega o valor da mesma linha da coluna
B
. - Trabalhando da última linha de dados na coluna para cima, isso leva a
D1
avaliando a primeira leitura válida na colunaB
.
- Se a linha atual contiver um valor de redefinição, a fórmula na coluna
-
coluna principal:
- Para uma linha de redefinição, a fórmula na coluna
C
verifica se está na primeira linha e, nesse caso, usa o valor da célula da colunaD
correspondente à mesma linha, ou seja,D1
. Se a fórmula estiver em qualquer outra linha da colunaC
, ela pegará o valor da célula imediatamente acima. - Se a linha for uma linha de temperatura válida, a fórmula agarra a leitura de temperatura da célula na coluna
B
correspondente à mesma linha.
- Para uma linha de redefinição, a fórmula na coluna