Respostas:
Isso funciona com texto e números e não se importa se houver células em branco, ou seja, retornará a última célula não em branco.
Ele precisa ser inserido na matriz , o que significa que você pressiona Ctrl-Shift-Enter depois de digitá-lo ou colá-lo. O seguinte é para a coluna A:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
CELL()
ou OFFSET()
), enquanto o mais votado retorna um valor sem dizer onde ele está.
Usar a seguinte fórmula simples é muito mais rápido
=LOOKUP(2,1/(A:A<>""),A:A)
Para Excel 2003:
=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
Oferece as seguintes vantagens:
Explicação:
(A:A<>"")
retorna array {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
modifica esta matriz para {1,1,..,#DIV/0!,..}
.LOOKUP
espera um array ordenado em ordem crescente , e levando em consideração que se a LOOKUP
função não puder encontrar uma correspondência exata, ela escolhe o maior valor no lookup_range
(no nosso caso {1,1,..,#DIV/0!,..}
) que é menor ou igual ao valor (no nosso caso 2
), formula encontra o último 1
na matriz e retorna o valor correspondente de result_range
(terceiro parâmetro - A:A
).Também uma pequena observação - a fórmula acima não leva em consideração células com erros (você pode vê-la somente se a última célula não vazia tiver erro). Se você quiser levá-los em consideração, use:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
a imagem abaixo mostra a diferença:
LOOKUP
diz que o último argumento result_vector
é opcional. No entanto, se omiti-lo, obtenho um resultado muito estranho que não compreendo.
LOOKUP
função não consegue encontrar o lookup_value
, a função corresponde ao maior valor em lookup_vector
que é menor ou igual a lookup_value.
" Se eu usar =LOOKUP(2,A:A<>"",A:A)
sem gerar o #DIV/0!
erro por 1/...
, parece que ele retorna algum valor no meio de o vetor. Eu não encontrei qual é a funcionalidade exata neste caso.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
mas adicionar ROW
função adicionará o efeito de "volatilidade" - a fórmula será recalculada cada vez que qualquer célula na planilha for alterada
Aqui está outra opção: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
vez de COUNT
). Sem mencionar as células em branco.
Inspirado pela grande pista dada pela resposta de Doug Glancy, descobri uma maneira de fazer a mesma coisa sem a necessidade de uma fórmula de matriz. Não me pergunte por quê, mas faço questão de evitar o uso de fórmulas de array, se possível (não por qualquer razão em particular, é apenas o meu estilo).
Aqui está:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
Para encontrar a última linha não vazia usando a coluna A como coluna de referência
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
Para encontrar a última coluna não vazia usando a linha 1 como a linha de referência
Isso pode ser utilizado em conjunto com a função de índice para definir eficientemente intervalos nomeados dinâmicos, mas isso é algo para outro post, pois não está relacionado à questão imediata abordada aqui.
Eu testei os métodos acima com o Excel 2010, tanto "nativamente" quanto no "Modo de compatibilidade" (para versões mais antigas do Excel) e eles funcionam. Novamente, com eles, você não precisa fazer nenhum dos Ctrl + Shift + Enter. Aproveitando a maneira como sumproduct funciona no Excel, podemos controlar a necessidade de realizar operações de matriz, mas fazemos isso sem uma fórmula de matriz. Espero que alguém por aí aprecie a beleza, simplicidade e elegância dessas soluções de sumproduct propostas tanto quanto eu. Eu não atesto a eficiência da memória das soluções acima. Só que eles são simples, têm uma aparência bonita, ajudam no propósito pretendido e são flexíveis o suficiente para estender seu uso a outros propósitos :)
Espero que isto ajude!
Muito bem sucedida!
Sei que essa pergunta é antiga, mas não estou satisfeito com as respostas fornecidas.
LOOKUP, VLOOKUP e HLOOKUP têm problemas de desempenho e nunca devem ser usados.
As funções de matriz têm muita sobrecarga e também podem ter problemas de desempenho, portanto, devem ser usadas apenas como último recurso.
COUNT e COUNTA apresentam problemas se os dados não estiverem contiguamente não em branco, ou seja, você tem espaços em branco e dados novamente no intervalo em questão
INDIRETO é volátil, portanto, deve ser usado apenas como último recurso
OFFSET é volátil, então só deve ser usado como último recurso
qualquer referência à última linha ou coluna possível (a 65536ª linha no Excel 2003, por exemplo) não é robusta e resulta em sobrecarga extra
Isso é o que eu uso
quando o tipo de dados é misturado: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
quando se sabe que os dados contêm apenas números: =MATCH(1E+306,[RANGE],1)
quando se sabe que os dados contêm apenas texto: =MATCH("*",[RANGE],-1)
MATCH tem a menor sobrecarga e não é volátil, portanto, se você estiver trabalhando com muitos dados, este é o melhor para usar.
TRUE
/ FALSE
), eles não serão detectados. Apesar do fato de que essa resposta não é à prova de balas, ainda acho que ela tem o menor impacto no desempenho.
=INDEX(N:N,MATCH(1E+306,N:N,1))
Isso funciona no Excel 2003 (e posteriormente com pequenas edições, veja abaixo). Pressione Ctrl + Shift + Enter (não apenas Enter) para inserir isso como uma fórmula de matriz.
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
Esteja ciente de que o Excel 2003 não pode aplicar uma fórmula de matriz a uma coluna inteira. Fazer isso rende #NUM!
; resultados imprevisíveis podem ocorrer! (EDITAR : Informações conflitantes da Microsoft: o mesmo pode ou não ser verdade sobre o Excel 2007; o problema pode ter sido corrigido em 2010. )
É por isso que aplico a fórmula de matriz para intervalo A1:A65535
e dou tratamento especial à última célula, que está A65536
no Excel 2003. Não posso apenas dizer A:A
ou mesmo A1:A65536
porque o último reverte automaticamente para A:A
.
Se você tiver certeza absoluta de que A65536
está em branco, você pode pular a IF
parte:
=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
Observe que se você estiver usando o Excel 2007 ou 2010, o número da última linha é 1048576 e não 65536, então ajuste o acima conforme apropriado.
Se não houver células em branco no meio de seus dados, eu usaria apenas a fórmula mais simples =INDEX(A:A,COUNTA(A:A))
,.
=INDEX(19:19,COUNTA(19:19))
Uma solução alternativa sem fórmulas de matriz, possivelmente mais robusta do que a resposta anterior com uma (dica para) solução sem fórmulas de matriz , é
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
Veja esta resposta como um exemplo. Parabéns a Brad e Barry Houdini , que ajudaram a resolver essa questão .
As possíveis razões para preferir uma fórmula sem matriz são fornecidas em:
Uma página oficial da Microsoft (procure "Desvantagens do uso de fórmulas de matriz").
As fórmulas de matriz podem parecer mágicas, mas também têm algumas desvantagens:
A
ocorrências por um D
. O que estou fazendo de errado?
se você pesquisar na coluna (A), use:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
se o seu intervalo for A1: A10, você pode usar:
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
nesta fórmula:
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
retorna o último número da linha não em branco e indir () retorna o valor da célula.
=INDEX(A:A, COUNTA(A:A), 1)
tirado daqui
=MATCH("*";A1:A10;-1)
para dados textuais
=MATCH(0;A1:A10;-1)
para dados numéricos
Eu tentei todas as versões não voláteis, mas nenhuma das versões acima funcionou. Excel 2003/2007 atualização. Certamente isso pode ser feito no Excel 2003. Não como uma matriz nem como uma fórmula padrão. Eu recebo apenas um erro em branco, 0 ou #valor. Então eu recorri aos métodos voláteis .. Isso funcionou ..
= LOOKUP (2,1 / (T4: T369 <> ""), T4: T369)
@Julian Kroné .. Usando ";" em vez de "," NÃO funciona! Acho que você está usando o Libre Office e não o MS Excel? LOOKUP é tão irritantemente volátil que uso-o apenas como último recurso
Coloque este código em um módulo VBA. Salve . Nas funções, definido pelo usuário, procure por esta função.
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
para dados textuais:
EQUIV("";A1:A10;-1)
para dados numéricos:
EQUIV(0;A1:A10;-1)
Isso fornece o índice relativo da última célula não vazia no intervalo selecionado (aqui A1: A10).
Se você deseja obter o valor, acesse-o via INDIRETO após construir -textualmente- a referência absoluta da célula, por exemplo:
INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
Eu também tive o mesmo problema. Esta fórmula também funciona bem: -
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14 sendo o número da linha da primeira linha nas linhas que você deseja contar.
Dente de garra crônico
Se você sabe que não haverá células vazias entre eles, o caminho mais rápido é este.
=INDIRECT("O"&(COUNT(O:O,"<>""")))
Ele apenas conta as células não vazias e se refere à célula apropriada.
Ele também pode ser usado para um intervalo específico.
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
Isso retorna a última célula não vazia no intervalo O4: O34.
Acho que a resposta de W5ALIVE é mais próxima do que uso para encontrar a última linha de dados em uma coluna. Supondo que estou procurando a última linha com dados na Coluna A, porém, eu usaria o seguinte para uma pesquisa mais genérica:
=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))
O primeiro MATCH encontrará a última célula de texto e o segundo MATCH encontrará a última célula numérica. A função IFERROR retorna zero se a primeira correspondência encontrar todas as células numéricas ou se a segunda correspondência encontrar todas as células de texto.
Basicamente, esta é uma pequena variação da solução mista de texto e número do W5ALIVE.
Ao testar o tempo, isso foi significativamente mais rápido do que as variações de LOOKUP equivalentes.
Para retornar o valor real da última célula, prefiro usar a referência indireta de células assim:
=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))
O método oferecido por sancho.s é talvez uma opção mais limpa, mas eu modificaria a parte que encontra o número da linha para este:
=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)
a única diferença é que ", 1" retorna o primeiro valor, enquanto ", 0" retorna toda a matriz de valores (todos menos um dos quais não são necessários). Ainda tendo a preferir endereçar a célula à função de índice lá, em outras palavras, retornar o valor da célula com:
=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))
Grande discussão!
Se você não tem medo de usar matrizes, a fórmula a seguir é muito simples para resolver o problema:
= SOMA (SE (A: A <> "", 1,0))
Você deve pressionar CTRL + SHIFT + ENTER porque esta é uma fórmula de matriz.
Ok, eu tive o mesmo problema do autor da pergunta e tentei as duas principais respostas. Mas apenas obtendo erros de fórmula. Acontece que eu precisava trocar o "," por ";" para que as fórmulas funcionem. Estou usando o XL 2007.
Exemplo:
=LOOKUP(2;1/(A:A<>"");A:A)
ou
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Para rastreamento de versão (adicionando a letra v ao início do número), descobri que este funciona bem no Xcelsius (SAP Dashboards)
="v"&MAX(A2:A500)