Última celda no vacía en una columna

112

¿Alguien conoce la fórmula para encontrar el valor de la última celda no vacía en una columna, en Microsoft Excel?

MichaelS
fuente
Estaría buscando a VBA para esto.
David Heffernan

Respuestas:

76

Esto funciona tanto con texto como con números y no le importa si hay celdas en blanco, es decir, devolverá la última celda que no está en blanco.

Debe ingresarse en una matriz , lo que significa que presione Ctrl-Shift-Enter después de escribirlo o pegarlo. Lo siguiente es para la columna A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Doug Glancy
fuente
@ Jean-François, Lo siento, reconocí eso en un comentario anoche, pero lo puse en la publicación original por error. Funciona en XL 2007 y 2010. Gracias.
Doug Glancy
No me funciona en Excel 2007. Pegué la fórmula exacta. Tengo una columna (A), donde los valores son = ROW () hasta 127ish, y la fórmula devuelve "1"
DontFretBrett
2
@DontFretBrett, asegúrese de ingresarlo como una fórmula de matriz con Ctrl-Shift-Enter como se especifica en la respuesta.
Doug Glancy
@DougGlancy falla por mi parte. ¡Gracias!
DontFretBrett
1
La diferencia importante es que este devuelve una referencia de celda (por lo que se puede pasar a, por ejemplo, CELL()o OFFSET()), mientras que el más votado devuelve un valor sin decirle dónde está.
GSerg
128

Usar la siguiente fórmula simple es mucho más rápido

=LOOKUP(2,1/(A:A<>""),A:A)

Para Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Te da las siguientes ventajas:

  • no es una fórmula de matriz
  • no es una fórmula volátil

Explicación:

  • (A:A<>"") devuelve matriz {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")modifica esta matriz a {1,1,..,#DIV/0!,..}.
  • Dado que LOOKUPespera una matriz ordenada en orden ascendente , y teniendo en cuenta que si la LOOKUPfunción no puede encontrar una coincidencia exacta, elige el valor más grande en el lookup_range(en nuestro caso {1,1,..,#DIV/0!,..}) que sea menor o igual al valor (en nuestro caso 2), fórmula encuentra el último 1en la matriz y devuelve el valor correspondiente de result_range(tercer parámetro - A:A).

También una pequeña nota : la fórmula anterior no tiene en cuenta las celdas con errores (solo puede verla si la última celda no vacía tiene un error). Si quieres tenerlos en cuenta, usa:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

la imagen de abajo muestra la diferencia:

ingrese la descripción de la imagen aquí

Dmitry Pavliv
fuente
gracias por la explicación y la bonita foto. Aún quedan algunas preguntas abiertas: 1. La documentación de LOOKUPdice que el último argumento result_vectores opcional. Sin embargo, si lo omito, obtengo un resultado muy extraño que no entiendo.
Honza Zidek
2. La documentación dice "Si la LOOKUPfunción no puede encontrar el lookup_value, la función coincide con el valor más grande lookup_vectorque es menor o igual a lookup_value." Si utilizo =LOOKUP(2,A:A<>"",A:A)sin generar el #DIV/0!error por 1/..., parece que devuelve algún valor en el medio de el vector. No he encontrado cuál es la funcionalidad exacta en este caso.
Honza Zidek
1
Muy bonita explicación. Habiendo reducido recientemente el cálculo de minutos al mover fórmulas de fórmulas de matriz a versiones sin matriz, siempre estoy listo para la lógica que funciona sin requerir fórmulas de matriz.
tobriand
1
@Enissay, sí, este devolverá el número de fila, =LOOKUP(2,1/(A:A<>""),ROW(A:A))pero agregar la ROWfunción agregará un efecto de "volatilidad": la fórmula se volverá a calcular cada vez que se cambie cualquier celda en la hoja de trabajo
Dmitry Pavliv
1
Hola. Gracias por publicar esto. Solo por curiosidad, encontré exactamente las mismas fórmulas y casi la misma redacción en exceljet.net/formula/get-value-of-last-non-empty-cell . ¿También eres tú o alguien más? No hay una conexión obvia.
Solomon Rutzky
24

Aquí tienes otra opción: =OFFSET($A$1;COUNTA(A:A)-1;0)

Patrick Honorez
fuente
9
Esto no funcionará si hay celdas con valores no numéricos (usar en COUNTAlugar de COUNT). Sin mencionar las celdas en blanco.
Jean-François Corbett
3
Esto debería estar en la parte superior. es simple y no se basa en detalles oscuros de funciones poco comunes.
Tmdean
9
No debe estar en la parte superior porque es incorrecto cuando los resultados tienen espacios en blanco incrustados.
Myrddin Emrys
17

Inspirado por la gran pista dada por la respuesta de Doug Glancy, se me ocurrió una manera de hacer lo mismo sin la necesidad de una fórmula de matriz. No me pregunte por qué, pero estoy dispuesto a evitar el uso de fórmulas de matriz si es posible (no por ninguna razón en particular, es solo mi estilo).

Aquí está:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Para encontrar la última fila no vacía usando la columna A como columna de referencia

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Para encontrar la última columna no vacía usando la fila 1 como fila de referencia

Esto se puede utilizar además junto con la función de índice para definir de manera eficiente rangos dinámicos con nombre, pero esto es algo para otra publicación, ya que no está relacionado con la pregunta inmediata que se aborda aquí.

He probado los métodos anteriores con Excel 2010, tanto "de forma nativa" como en "Modo de compatibilidad" (para versiones anteriores de Excel) y funcionan. Nuevamente, con estos no necesita hacer nada de Ctrl + Shift + Enter. Al aprovechar la forma en que funciona el sumproducto en Excel, podemos entender la necesidad de realizar operaciones de matriz, pero lo hacemos sin una fórmula de matriz. Espero que alguien pueda apreciar la belleza, la simplicidad y la elegancia de estas soluciones de sumproducto propuestas tanto como yo. Sin embargo, no doy fe de la eficiencia de memoria de las soluciones anteriores. Solo que son simples, se ven hermosos, ayudan al propósito previsto y son lo suficientemente flexibles como para extender su uso a otros propósitos :)

¡Espero que esto ayude!

¡Todo lo mejor!

Santiago
fuente
1
En cuanto a por qué usar fórmulas sin matriz, consulte esta respuesta a continuación .
sancho.s ReinstateMonicaCellio
17

Sé que esta pregunta es antigua, pero no estoy satisfecho con las respuestas proporcionadas.

  • LOOKUP, VLOOKUP y HLOOKUP tienen problemas de rendimiento y nunca deberían usarse.

  • Las funciones de matriz tienen mucha sobrecarga y también pueden tener problemas de rendimiento, por lo que solo deben usarse como último recurso.

  • COUNT y COUNTA tienen problemas si los datos no están contiguos sin espacios en blanco, es decir, tiene espacios en blanco y luego datos nuevamente en el rango en cuestión

  • INDIRECT es volátil, por lo que solo debe usarse como último recurso.

  • OFFSET es volátil, por lo que solo debe usarse como último recurso

  • cualquier referencia a la última fila o columna posible (la fila 65536th en Excel 2003, por ejemplo) no es sólida y resulta en una sobrecarga adicional

Esto es lo que yo uso

  • cuando el tipo de datos es mixto: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • cuando se sabe que los datos contienen solo números: =MATCH(1E+306,[RANGE],1)

  • cuando se sabe que los datos contienen solo texto: =MATCH("*",[RANGE],-1)

MATCH tiene la sobrecarga más baja y no es volátil, por lo que si está trabajando con muchos datos, este es el mejor para usar.

W5ALIVE
fuente
Esta es una buena respuesta (+1), pero todavía hay algunas lagunas que este método puede pasar por alto. Por ejemplo, si hay celdas con valores lógicos ( TRUE/ FALSE), no se detectarán. A pesar de que esta respuesta no es a prueba de balas, sigo pensando que esta respuesta tiene el menor impacto en el rendimiento.
ImaginaryHuman072889
2
Match devuelve un índice, no el valor de la celda. Puede utilizar la función de índice para obtener el valor. Además, probablemente debería incluir algo sobre lo que se supone que es [RANGE]. Seleccioné toda la columna usando "N: N". Aquí hay un ejemplo que funcionó para mí: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

Esto funciona en Excel 2003 (y posteriores con una edición menor, ver más abajo). Presione Ctrl + Shift + Enter (no solo Enter) para ingresar esto como una fórmula de matriz.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Tenga en cuenta que Excel 2003 no puede aplicar una fórmula de matriz a una columna completa. Hacerlo rinde #NUM!; ¡Pueden ocurrir resultados impredecibles! (EDITAR : Información contradictoria de Microsoft: lo mismo puede ser cierto o no sobre Excel 2007; es posible que el problema se haya solucionado en 2010. )

Es por eso que aplico la fórmula de matriz al rango A1:A65535y le doy un tratamiento especial a la última celda, que está A65536en Excel 2003. No puedo simplemente decir A:Ao incluso A1:A65536cuando esta última automáticamente vuelve a A:A.

Si está absolutamente seguro de que A65536está en blanco, puede omitir la IFparte:

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Tenga en cuenta que si está utilizando Excel 2007 o 2010, el último número de fila es 1048576, no 65536, así que ajuste el anterior según corresponda.

Si no hay celdas en blanco en el centro de sus datos, entonces me gustaría utilizar la fórmula más simple, =INDEX(A:A,COUNTA(A:A)).

Jean-François Corbett
fuente
Para ROW en lugar de columna, esto funcionó para mí=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

Una solución alternativa sin fórmulas de matriz, posiblemente más robusta que la de una respuesta anterior con una (sugerencia a) solución sin fórmulas de matriz , es

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

Vea esta respuesta como ejemplo. Felicitaciones a Brad y barry houdini , quienes ayudaron a resolver esta pregunta .

Las posibles razones para preferir una fórmula sin matriz se dan en:

  1. Una página oficial de Microsoft (busque "Desventajas de usar fórmulas de matriz").
    Las fórmulas de matriz pueden parecer mágicas, pero también tienen algunas desventajas:

    • Es posible que ocasionalmente olvide presionar CTRL + MAYÚS + ENTRAR. Recuerde presionar esta combinación de teclas cada vez que ingrese o edite una fórmula de matriz.
    • Es posible que otros usuarios no comprendan sus fórmulas. Las fórmulas de matriz están relativamente indocumentadas, por lo que si otras personas necesitan modificar sus libros de trabajo, debe evitar las fórmulas de matriz o asegurarse de que esos usuarios entiendan cómo cambiarlas.
    • Según la velocidad de procesamiento y la memoria de su computadora, las fórmulas de matriz grande pueden ralentizar los cálculos.
  2. Herejía de fórmula de matriz .

sancho.s ReinstateMonicaCellio
fuente
No puedo hacer que esto funcione con la columna D. Reemplacé todas las Aapariciones con un D. ¿Qué estoy haciendo mal?
Marc.2377
5

si busca en la columna (A) use:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

si su rango es A1: A10 puede usar:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

en esta fórmula:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

devuelve el último número de fila que no está en blanco e indirecto () devuelve el valor de celda.

Sharif Lotfi
fuente
2

=INDEX(A:A, COUNTA(A:A), 1)tomado de aquí

HattrickNZ
fuente
2

=MATCH("*";A1:A10;-1) para datos textuales

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

liharvi
fuente
Utilice bloques de código cuando proporcione un fragmento de código en sus respuestas.
β.εηοιτ.βε
Creo que estas fórmulas nos darán la primera celda no vacía, no la última celda no vacía.
Baodad
2

He probado todas las versiones no volátiles, pero ninguna de las versiones anteriores ha funcionado ... Excel 2003/2007update. Seguramente esto se puede hacer en Excel 2003. No como una matriz ni como una fórmula estándar. Recibo solo un error en blanco, 0 o #valor. Así que recurro a los métodos volátiles ... Esto funcionó ...

= BUSCAR (2,1 / (T4: T369 <> ""), T4: T369)

@Julian Kroné .. Usando ";" en lugar de "," NO funciona! Creo que estás usando Libre Office, no MS Excel. LOOKUP es tan molestamente volátil que lo uso solo como último recurso

remoto uno
fuente
0

Coloque este código en un módulo VBA. Salvar. En funciones, definido por el usuario buscar esta función.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
fuente
2
Esta no es necesariamente la ÚLTIMA celda en blanco, solo la SIGUIENTE celda en blanco que comienza en la parte superior.
Portland Runner
La pregunta es sobre una fórmula, no VBA
Patrick Honorez
0

para datos textuales:

EQUIV("";A1:A10;-1)

para datos numéricos:

EQUIV(0;A1:A10;-1)

Esto le da el índice relativo de la última celda no vacía en el rango seleccionado (aquí A1: A10).

Si desea obtener el valor, acceda a él a través de INDIRECTO después de construir -textualmente- la referencia de celda absoluta, por ejemplo:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
Adel
fuente
0

Yo también tuve el mismo problema. Esta fórmula también funciona igualmente bien:

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 es el número de fila de la primera fila de las filas que desea contar.

Diente de garra crónica

Diente de garra crónica
fuente
0

Usé HLOOKUP

A1tiene una cita; A2:A8tiene previsiones capturadas en diferentes momentos, quiero las últimas

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

Esto usa una fórmula de búsqueda estándar con la matriz de búsqueda definida por el número de entradas.

Chris
fuente
0

Si sabe que no habrá celdas vacías en el medio, la forma más rápida es esta.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Solo cuenta las celdas que no están vacías y se refiere a la celda apropiada.

También se puede utilizar para un rango específico.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Esto devuelve la última celda no vacía en el rango O4: O34.

Tassos Mallis
fuente
0

Para Microsoft Office 2013

"Último menos uno" de una fila no vacía:

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

"Última" fila no vacía:

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

Esta fórmula funcionó conmigo para Office 2010:

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

A1: la primera celda A100: consulte la última celda en la comparación

Wahed
fuente
0

Creo que la respuesta de W5ALIVE está más cerca de lo que uso para encontrar la última fila de datos en una columna. Sin embargo, suponiendo que estoy buscando la última fila con datos en la Columna A, usaría lo siguiente para la búsqueda más genérica:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

El primer PARTIDO encontrará la última celda de texto y el segundo PARTIDO encontrará la última celda numérica. La función SI.ERROR devuelve cero si la primera COINCIDENCIA encuentra todas las celdas numéricas o si la segunda coincidencia encuentra todas las celdas de texto.

Básicamente, esta es una ligera variación de la solución mixta de texto y números de W5ALIVE.

Al probar la sincronización, esto fue significativamente más rápido que las variaciones de BUSCAR equivalentes.

Para devolver el valor real de esa última celda, prefiero usar una referencia de celda indirecta como esta:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

El método ofrecido por sancho.s es quizás una opción más limpia, pero modificaría la parte que encuentra el número de fila a esto:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

la única diferencia es que ", 1" devuelve el primer valor mientras que ", 0" devuelve la matriz completa de valores (todos menos uno de los cuales no son necesarios). Todavía tiendo a preferir dirigir la celda a la función de índice allí, en otras palabras, devolver el valor de la celda con:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

¡Gran hilo!

FocusWiz
fuente
0

Si no tiene miedo de usar matrices, la siguiente es una fórmula muy simple para resolver el problema:

= SUMA (SI (A: A <> "", 1,0))

Debe presionar CTRL + MAYÚS + ENTRAR porque esta es una fórmula de matriz.

Bits_of_guy
fuente
-1

Uno simple que funciona para mí:

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

De acuerdo, tuve el mismo problema que el autor de la pregunta y probé las dos respuestas principales. Pero solo obteniendo errores de fórmula. Resultó que necesitaba cambiar el "," por ";" para que las fórmulas funcionen. Estoy usando XL 2007.

Ejemplo:

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

o

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Julian Kroné
fuente
-3

Para el seguimiento de versiones (agregando la letra v al principio del número), encontré que este funciona bien en Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)
Sr. B
fuente
1
Parece insuficientemente general, ya que se basa en un orden estrictamente ascendente.
Nathan Tuggy