Última célula não vazia em uma coluna

112

Alguém conhece a fórmula para encontrar o valor da última célula não vazia de uma coluna, no Microsoft Excel?

MichaelS
fonte
Eu estaria procurando o VBA para isso.
David Heffernan

Respostas:

76

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))))
Doug Glancy
fonte
@ Jean-François, Desculpe, reconheci isso em um comentário ontem à noite, mas coloquei no post original por engano. Ele funciona no XL 2007 e 2010. Obrigado.
Doug Glancy
Não funciona para mim no Excel 2007. Colei a fórmula exata. Eu tenho uma coluna (A), onde os valores são = ROW () até 127ish e a fórmula retorna "1"
DontFretBrett
2
@DontFretBrett, certifique-se de inseri-lo como uma fórmula de matriz com Ctrl-Shift-Enter conforme especificado na resposta.
Doug Glancy,
@DougGlancy falhou da minha parte. Obrigado!
DontFretBrett
1
A diferença importante é que este retorna uma referência de célula (portanto, pode ser passado para eg CELL()ou OFFSET()), enquanto o mais votado retorna um valor sem dizer onde ele está.
GSerg 01 de
128

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:

  • não é array fórmula de
  • não é fórmula volátil

Explicação:

  • (A:A<>"") retorna array {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"") modifica esta matriz para {1,1,..,#DIV/0!,..} .
  • Uma vez que LOOKUPespera um array ordenado em ordem crescente , e levando em consideração que se a LOOKUPfunçã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 1na 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:

insira a descrição da imagem aqui

Dmitry Pavliv
fonte
obrigado pela explicação e bela imagem. Ainda restam algumas questões em aberto: 1. A documentação para LOOKUPdiz que o último argumento result_vectoré opcional. No entanto, se omiti-lo, obtenho um resultado muito estranho que não compreendo.
Honza Zidek
2. A documentação diz "Se a LOOKUPfunção não consegue encontrar o lookup_value, a função corresponde ao maior valor em lookup_vectorque é 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.
Honza Zidek
1
Explicação muito boa. Tendo recentemente economizado alguns minutos de cálculo movendo fórmulas de fórmulas de matriz para versões sem matriz, estou sempre pronto para a lógica que funciona sem exigir fórmulas de matriz.
tobriand
1
@Enissay, sim, este retornará o número da linha, =LOOKUP(2,1/(A:A<>""),ROW(A:A))mas adicionar ROWfunção adicionará o efeito de "volatilidade" - a fórmula será recalculada cada vez que qualquer célula na planilha for alterada
Dmitry Pavliv
1
Olá. Obrigado por postar isso. Por curiosidade, encontrei exatamente as mesmas fórmulas e quase o mesmo texto em exceljet.net/formula/get-value-of-last-non-empty-cell . É você ou outra pessoa? Não há conexão óbvia.
Solomon Rutzky
24

Aqui está outra opção: =OFFSET($A$1;COUNTA(A:A)-1;0)

Patrick Honorez
fonte
9
Isso não funcionará se houver células com valores não numéricos (use em COUNTAvez de COUNT). Sem mencionar as células em branco.
Jean-François Corbett
3
Isso deve estar no topo. é simples e não depende de detalhes obscuros de funções incomuns.
Tmdean
9
Não deve estar no topo porque está errado quando os resultados têm espaços em branco incorporados.
Myrddin Emrys
17

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!

Santiago
fonte
1
Quanto ao motivo de usar fórmulas sem matriz, veja esta resposta abaixo .
sancho.s ReinstateMonicaCellio
17

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.

W5ALIVE
fonte
Esta é uma boa resposta (+1), mas ainda existem algumas lacunas que este método pode ignorar. Por exemplo, se houver células com valores lógicos ( 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.
ImaginaryHuman072889
2
Match retorna um índice, não o valor da célula. Você pode usar a função de índice para obter o valor. Além disso, você provavelmente deve incluir algo sobre o que [RANGE] deve ser. Selecionei a coluna inteira usando "N: N". Aqui está um exemplo que funcionou para mim: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

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:A65535e dou tratamento especial à última célula, que está A65536no Excel 2003. Não posso apenas dizer A:Aou mesmo A1:A65536porque o último reverte automaticamente para A:A.

Se você tiver certeza absoluta de que A65536está em branco, você pode pular a IFparte:

=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)),.

Jean-François Corbett
fonte
Para ROW em vez de coluna, funcionou para mim=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

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:

  1. 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:

    • Ocasionalmente, você pode esquecer de pressionar CTRL + SHIFT + ENTER. Lembre-se de pressionar esta combinação de teclas sempre que inserir ou editar uma fórmula de matriz.
    • Outros usuários podem não entender suas fórmulas. Fórmulas de matriz são relativamente não documentadas, portanto, se outras pessoas precisarem modificar suas pastas de trabalho, você deve evitar fórmulas de matriz ou certificar-se de que os usuários entendam como alterá-las.
    • Dependendo da velocidade de processamento e da memória do seu computador, fórmulas de grandes matrizes podem retardar os cálculos.
  2. Array Formula Heresy .

sancho.s ReinstateMonicaCellio
fonte
Não consigo fazer isso funcionar com a coluna D. Substituí todas as Aocorrências por um D. O que estou fazendo de errado?
Marc.2377
5

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.

Sharif Lotfi
fonte
2

=INDEX(A:A, COUNTA(A:A), 1)tirado daqui

HattrickNZ
fonte
2

=MATCH("*";A1:A10;-1) para dados textuais

=MATCH(0;A1:A10;-1) para dados numéricos

Liharvi
fonte
Use blocos de código ao fornecer o snippet de código em suas respostas.
β.εηοιτ.βε
Acho que essas fórmulas nos darão a primeira célula não vazia, não a última célula não vazia.
Baodad
2

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

um remoto
fonte
0

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
Mac vd Wsthuizen
fonte
2
Esta não é necessariamente a ÚLTIMA célula em branco, apenas a PRÓXIMA célula em branco começando no topo.
Portland Runner
A pergunta é sobre uma fórmula, não VBA
Patrick Honorez
0

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))
Adel
fonte
0

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

Dente de garra crônico
fonte
0

Eu usei HLOOKUP

A1tem um encontro; A2:A8tem previsões capturadas em momentos diferentes, quero o mais recente

=Hlookup(a1,a1:a8,count(a2:a8)+1)

Isso usa uma fórmula hlookup padrão com a matriz de pesquisa definida pelo número de entradas.

Chris
fonte
0

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.

Tassos Mallis
fonte
0

Para Microsoft office 2013

"Último menos um" de uma linha não vazia:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

"Última" linha não vazia:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
Aprodan
fonte
0

Esta fórmula funcionou comigo para o Office 2010:

= LOOKUP (2; 1 / (A1: A100 <> ""); A1: A100)

A1: a primeira célula A100: refere-se à última célula na comparação

Wahed
fonte
0

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!

FocusWiz
fonte
0

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.

Bits_of_guy
fonte
-1

Um simples que funciona para mim:

=F7-INDEX(A:A,COUNT(A:A))
nemo
fonte
-1

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))))
Julian Kroné
fonte
-3

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)
Sr. B
fonte
1
Parece insuficientemente geral, pois depende de uma ordem estritamente ascendente.
Nathan Tuggy