Hojas de cálculo en Excel - página principal

Eliminar filas vacías

A veces tenemos la necesidad de eliminar dentro de un extenso rango de datos, todas aquellas filas que están vacías. Es decir, imaginemos que tenemos algún dato entre la fila 1 y la fila 1.000 de la columna A, pero que en ese rango de datos, hay unas cuantas líneas vacías (sin datos), que queremos eliminar. ¿Cómo podríamos eliminar estas filas en un plis-plas?.

Pues una opción es a través de este macro que os presento. Para ver como funciona, tan solo tendremos que situarnos en la primera celda del rango a inspeccionar (en el ejemplo anterior, deberíamos situarnos en la celda A1):


Sub Eliminar_filas_vacias()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'suprondremos que vamos a inspeccionar 1.000 filas,
'en busca de todas las que haya en blanco

For i = 1 To 1000
'si la celda está vacía...
If ActiveCell = "" Or IsNull(ActiveCell) Then
'nos quedamos con la celda donde estamos
'para volver a ella posteriormente

celda = ActiveCell.Address
'vamos hasta la primera celda a la
'derecha que encontremos, con datos

Selection.End(xlToRight).Select
'si está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'miramos si a la izquierda hay datos
Selection.End(xlToLeft).Select
'si también está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'eliminamos la fila
Selection.EntireRow.Delete
'volvemos a la celda donde estábamos
'siempre y cuando no estemos en la fila 1

If ActiveCell.Row <> 1 Then Range(celda).Offset(-1, 0).Select
End If
End If
End If
'pasamos a la siguiente fila
ActiveCell.Offset(1, 0).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Por sugerencia de un usuario que ha dejado un comentario, he incluido la opción de verificar que efectivamente toda una línea está vacía, para no eliminar solo las filas donde la celda activa se encuentre vacía (si leéis el comentario de montesama, entenderéis mejor los términos de esta apreciación).



59 comentarios:

montesama dijo...

Sólo un pequeño comentario:

Con esa macro, inspeccionas una fila desde una celda de partida, hasta mil celdas hacia abajo, eliminando las filas que contengan una celda vacía en la columna que inspeccionas, pero ocurrirá que puedes eliminar datos contenidos en otras celdas de la misma fila que no estén vacías ¿no?

Javier Marco dijo...

Efectivamente. Pero se supone que en la mayoría de ocasiones, cuando tienes una celda vacía y quieres eliminar filas, todas las celdas contiguas, tanto a su derecha como a su izquierda, suelen estar vacías.

En principio no tiene mucho sentido tener A44, B44, y C44 vacías, y por otro lado tener un dato en IN44 (muchísimas filas a la derecha de C44).

No obstante, y a la vista de tu consulta, incluyo en el artículo, la opción de verificar que efectivamente toda una fila está vacía, para eliminar solo aquellas filas que realmente no contienen datos.

Saludos.

Anónimo dijo...

Buenas,

No tengo mucha idea de macros, pero la información me puede ir muy bien aunque si tuviese alguna modificación, si sois tan amables.
Necesito eliminar las filas que contengan una celda vacía en la columna S.
Alguien me puede echar una mano??

Muchas gracias por anticipado

Javier Marco dijo...

Pásate por aquí, para saber como crear un macro

Salu2

sly dijo...

Hola. El código funciona muy bien. Con respecto a lo que dice montesama, dejame comentarte que justamenete es el código anterior el que necesito, es decir quiero borrar filas vacias, y filas cuya primera celda esta vacia. Podría incluirlo adicionalmente. Gracias

Javier Marco dijo...

Con este código borrarás todas las filas, pero solo atendiendo al criterio de que en esa columna donde ejecutes el macro, haya una celda vacía. Es decir, no se comprueba si toda la fila está vacía (cosa que ya hace el macro del artículo, a instancias de una sugerencia de otro usuario):

Sub Eliminar_filas_con_primera_celda_vacia()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'suprondremos que vamos a inspeccionar 1.000 filas,
'en busca de todas las que haya en blanco
For i = 1 To 1000
'si la celda está vacía...
If ActiveCell = "" Or IsNull(ActiveCell) Then
'nos quedamos con la celda donde estamos
'para volver a ella posteriormente
celda = ActiveCell.Address
'eliminamos la fila
Selection.EntireRow.Delete
'volvemos a la celda donde estábamos
'siempre y cuando no estemos en la fila 1
If ActiveCell.Row <> 1 Then Range(celda).Offset(-1, 0).Select
End If
'pasamos a la siguiente fila
ActiveCell.Offset(1, 0).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Un saludo.

A. Cánovas dijo...

Hola Javier
Enhorabuena por su magnífico blog, por lo claro y exahustivo de la información.
Tengo una dificultad con la ocultación de determinadas filas (según unas variables) en un cuadro de amortización de préstamo. Los ejemplos que ha puesto han me viene al pelo, pero no consigo superar el error que me sale con la instrucción "Selection.EntireRow.Hidden = True".
Gracias y saludos,

Javier Marco dijo...

Hola A. Cánovas...

Pues la verdad es que esa instrucción no tiene mucho truco. Aquella fila en cuya celda estés situado, se ocultará.

Yo más bien creo que el error te debe venir por otro lado. No parece muy lógico que te aparezca un error en esa línea.

Salu2

Diego M dijo...

Hola que tal Javier una pregunta quiero eliminar una fila en la que la primera este en blanco y a la derecha tenga una palabra especifica, en si ya lo estado haciendo pero el problema es que hala hora de mandarlo a la derecha se que en la celda de la derecha y no regresa la celda donde estaba y mi pregunta es como le hago para que se regrese al celda donde estábamos
el comando que escribí es el siguiente :

Sub Eliminar()
Application.ScreenUpdating = False
For i = 1 To 1000
If ActiveCell = "" Or IsNull(ActiveCell) Then
celda = ActiveCell.Address
Selection.End(xlToLeft).Select
If ActiveCell = "DTS" Then
Selection.EntireRow.Delete
If ActiveCell.Row <> 1 Then Range(celda).Offset(-1, 0).Select
End If
End If
ActiveCell.Offset(1, 0).Select
Next
Application.ScreenUpdating = True
End Sub

Javier Marco dijo...

Prueba esto:

Sub Eliminar()
'oculatmos el procecimiento
Application.ScreenUpdating = False
'nos situamos en la celda a evaluar
Range("A1").Select
'para 1000 filas
For i = 1 To 1000
'si la celda activa está vacía o es nula
If ActiveCell = "" Or IsNull(ActiveCell) Then
'miramos si en la columna de su derecha
'aparece la palabra DTS (tanto si está en
'mayúsculas como en minúsculas
If UCase(ActiveCell.Offset(0, 1)) = "DTS" Then
'si es así, eliminamos la fila
Selection.EntireRow.Delete
'Nos situamos en la fila anterior,
'pues la nueva, ha desaparecido, siempre
'y cuando no estemos en la primera fila
If ActiveCell.Row <> 1 Then ActiveCell.Offset(-1, 0).Select
End If
End If
'bajamos a la fila siguiente
ActiveCell.Offset(1, 0).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Saludos.

Diego M dijo...

hola que tal Javier gracias por la información estuvo correcta todo pero tengo otra duda, la palabra era correcta era DTS pero si quiero agregar mas palabras que debo hacer un nuevo contador? si si como se hace o como se hace. Gracias y perdón pero soy nuevo en esto.

Javier Marco dijo...

Pues si tienes varias palabras, puedes utilizar el if de la siguiente forma:

If UCase(ActiveCell.Offset(0, 1)) = "DTS" OR UCase(ActiveCell.Offset(0, 1)) = "GTI" OR UCase(ActiveCell.Offset(0, 1)) = "EXCEL" Then

En el caso de que tengas muchas palabras, es preferible utilizar en lugar del condicional IF, la instrucción SELECT CASE, e ir indicando las posibles opciones. Si googleas un poco, verás que hay muchos ejemplos sobre el uso de SELECT CASE, aunque en la propia ayuda de Excel (desde VBA) también tienes info al respecto (desde el modo VBA, pulsa F1).

Saludos.

adan dijo...

excelente blog y justo la macro que necesitaba ya que busque por horas sin resultados felicidades

Javier Marco dijo...

Muchas gracias por tu comentario :-)

Anónimo dijo...

Hola!! No sabía donde situar la siguiente duda.¿Cómo bloquear las barras de desplazamiento? Es decir, no quiero ocultarlas, sino, mediante macros que quede fija la pantalla, ni para la derecha ni para abajo. Muchas gracias. Por favor, sigue desarrollando tu blog. me encantaaa! ;)

Javier Marco dijo...

Prueba esto:

Sub sin_barras()
'Desactivamos las barras de desplazamiento
With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
End With
End Sub

Lo he hecho con la grabadora de macros :-)

Anónimo dijo...

Hola ! Pero eso lo oculta. Me parece que tendré que ocultar las columnas y filas o bloquear el resto por donde no quiero que se muevan. Ahora me doy cuenta que no tenía mucho sentido mi duda jajaja, perdón!

Anónimo dijo...

Ante la deseperación me vi obligado a buscar y me encontré gratamente con tu blog. ¡Excelente!
¿Permíteme hacerte una pregunta?
He visto como se pueen eliminar lineas vacías y aquellas en las que la segunda columna tiene una palabra concreta (DTS). ¿Cómo se eliminarían las líneas cuya segunda columna empiecen con una palabra determinada como "Total"?
Gracias

Anónimo dijo...

¡¡¡ Lo encontré!!!

Basta con poner en el comparador ">"

Alejandro dijo...

muy buena respuesta, me ha ayudado en varios trabajossssssssss. La macro esta excelente

Antonio dijo...

Excelente Blog Javier felicidades, es la macro que estaba buscando por que me hice a "mano" la eliminación de cerca de 5,000 filas en blanco con informacion intermedia y cuando vi esta macro te he puesto un altar.

Gracias desde la Ciudad México
Antonio Castro V.

Javier Marco dijo...

Gracias por tu comentario, Antonio. Me conformo con que lo que hayas encontrado en el blog te haya sido de utilidad. Los altares para los santos ;-)

Gendos... dijo...

preg preg.... si lo que quieren borrar es toda la fila solamente teniendo en cuenta qeu el campo de la columna A este vacio prueben con esto

Range("a:a").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

capz que es mas cortito...


Abrazooo

Javier Marco dijo...

Gracias Gendos, pero tal y como proponía otro lector del blog, eso tiene el riesgo de que si en la columna B, C, D, etc. tienes datos, que te los cargues. Por eso busqué una solución que lo que hace es mirar si toda la fila está vacía, no solo una columna.

Nacho dijo...

Expectacular Montesama.

sabs dónde puedo hacer un curso de visual basic + excel de forma on line?

Javier Marco dijo...

Pues desconozco si hay cursos online de este tipo.

Un saludo.

Anónimo dijo...

Compa elegante su macro, seguire leyendo las demas porque son de mucha utilidad.- Hay les dejo una modificacion de la macro para que en vez de inspeccionar mil filas, el usuario pueda ingresar el numero de filas que desea inspeccionar:

Sub Elimina_Filas_Vacias()
'
' Elimina_Filas_Vacias Macro
' Macro grabada el 07/09/2009
'
' Acceso directo: Ctrl+Mayús+D
'
'ocultamos el procedimiento
Application.ScreenUpdating = False
'suprondremos que vamos a inspeccionar x filas,
'en busca de todas las que haya en blanco
x = InputBox("¿Cuantas filas deseas inspeccionar?", "Eliminar Filas")
For i = 1 To x
'si la celda está vacía...
If ActiveCell = "" Or IsNull(ActiveCell) Then
'nos quedamos con la celda donde estamos
'para volver a ella posteriormente
celda = ActiveCell.Address
'vamos hasta la primera celda a la
'derecha que encontremos, con datos
Selection.End(xlToRight).Select
'si está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'miramos si a la izquierda hay datos
Selection.End(xlToLeft).Select
'si también está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'eliminamos la fila
Selection.EntireRow.Delete
'volvemos a la celda donde estábamos
'siempre y cuando no estemos en la fila 1
If ActiveCell.Row <> 1 Then Range(celda).Offset(-1, 0).Select
End If
End If
End If
'pasamos a la siguiente fila
ActiveCell.Offset(1, 0).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Att: felix

Anónimo dijo...

una ayuda necesito saber como hago para elimina la filas vacias de una hoja de calculo teniendo en cuenta que siemprevan a estar al final de la hoja despues de el ultimo dato. Ademas de eso no siempre va a ser el mismo rango de datos. Gracias...

Erick el Rojo dijo...

Eliminar filas vacías se puede hacer también seleccionando (sombreando) una columna del rango le das a F5, luego al boton "Especial" y en la ventan final a "Celdas en blanco". Lo anterior te selecciona todas las casillas de las filas que quieres eliminar. Por último le das a eliminar filas y listo. El comando F5 es muy útil para seleccionar y después hacer operaciones con las celdas seleccionada.

Javier Marco dijo...

Gracias por tu aporte, Erick.

En este artículo se explica como hacer todo eso de manera automatizada, sin tener ni siquiera que interaccionar con los menús.

Hector Aquiles dijo...

Muy util tu blog, me ha sido de mucha ayuda pero quisiera saber como puedo limpiar filas con datos pero mantener las formulas, ojala despliegue un texbox para solicitar confirmacion de laorde, prove con algunas cosas pero nada me fue de utilidad, por ahy ocupe un macros que me borraba todos los datos pero no me sirve, si me puedes ayudar para mi exelente, saludos

Javier Marco dijo...

Piensa que en ua fórmula, el primer caracter es el signo igual. Evalúa el contenido de esa celda, para saber eso, y si es fórmula, no borras el dato, pero si no es fórmula (no tiene un "igual"), entonces borras el dato.

Aquí tienes un ejemplo, para poner un rango de celdas en mayúsculas o minúsculas, donde se evalúa si hay fórmula o no: Poner en mayúsculas o en minúsculas.

Anónimo dijo...

Hola felicidades por tu Blog. Tengo un problema tengo una hoja en excel la cual necesito acomodar de tal manera que la información que se encuentre en cada una de las columnas forme 5 diferentes lineas.
Ejemplo:
6 145 977 55 0 36 97 77
8 850 100 65 2 87 33 14

El resultado que deseo en una hoja nueva es:
6 145 977 55
6 145 977 0
6 145 977 36
6 145 977 97
6 145 977 77
8 850 100 65
8 850 100 2 y asi sucesivamentes. ¿Podrás ayudarme? Gracias de antemano.

Anónimo dijo...

Javier,buenas tardes, espero que este bien, tengo una duda,PREGUNTA # 1: la macro que describen aqui el cual borra unicamente las celdas vacias colocandose en A1, funciona de maravilla, pero como puedo hacerle para que corra iniciando en otra celda, por ejemplo C1?, PREGUNTA # 2: tambien he tratado con esta macro pero solo me borra una parte y luego deja de hacerlo enviando un mensaje que dice "type mismatch" Sub eliminarfilavacia()
For Row = 1 To 1000
If Cells(Row, 3).Value = "" Then
Rows(Row).Delete
End If
Next Row
End Sub

cree que pueda hecharle un ojo poque me marca eso?, gracias, saludos coordiales (Jose)

Javier Marco dijo...

Si te lees bien el artículo, verás que sirve para eliminar filas vacías de cualquier columna. Simplemente debes situarte en la celda de la columna deseada, y ejecutar el macro.

Anónimo dijo...

Javier
Buenas tardes, ahora tengo otro detalle, resulta que tengo informacion de A2:F20 en el cual se agrega informacion manualmente de valores exactos en fracciones en algun punto de la planta , por ejemplo en A2 agregamos 1.003, B2 2.89,C2 5.2,D2 lo que he querido hacer es que al vaciar estos valores(copy paste, claro)en A2 coloque 2, B2 3,C2 6 y D2 6, he tratado de hacerlo con formato condicional agregando la formula =ceiling(A2,1) para que se haga el cambio en automatico en todo ese rango pero no quiere funcionar. Si metemos en otra celda la formula ceiling referenciando la celda a redondear lo hace, pero eso no es lo que deseo, si pudiera ud ayudarme se lo agradeceria mucho, cree que pueda hecharle un ojo?, Gracias!!!
saludos
(Jose)

Jesus dijo...

HOLA, SOY NUEVO EN ESTO DE LAS MACROS .CUANDO COPIO LAS INSTRUCCIONES EN VISUAL BASIC Y LO EJECUTO ME BORRA TODOS LOS DATOS DE LA PESTAÑA. LO QUE YO ESTOY TRATANDO DE HACER ES DESDE OTRO LIBRO ESTOY BUSCANDO DATOS Y MEDIANTE UN "SI" ESTOY PEGANDO EL RESULTADO EN LA CELDA CORRESPONDIENTE. ESTO ME CREA CELDAS EN BLANCO, AUNQUE CON "" CUANDO APLICO LA MACRO ME BORRA TODO.
ALGUIEN ME PUEDE AYUDAR, GRACIAS

GABRIELA ROMERO dijo...

hOLA! QUE TAL..? TENGO UNA SUPER DUDA...
ESTOY TRTABAJANDO CON VARIAS HOJAS DEPEDIENTES UNA DE OTRA... EN LA HOJA 2 TENGO VARIAS COLUMNAS "NOMBRE" "APELLIDO" "F.N.""ESTUDIA?" Y OTRAS... EN LA QUE PREGUNTA SI ESTUDIA, SI/NO... EN LA HOJA 3, DEBO PONER LAS PERSONAS QUE "SI" ESTUDIAN, LO HICE CON FUNCION SI, PERO ME QUEDAN FILAS EN BLANCO (CORRESPONDIENTES A LAS QUE NO), ME GUSTARIA ENLISTAR UNA DEBAJO DE LA OTRA,CON SUS CORRESPONDIENTES DATOS, QUE ME RECOMIENDA? PARA HACER UN TRABAJO MAS IMPECABLE, MACROS? FORMULAS? GRACIAS DE ANTEMANO!! Y EXCELENTISIMA SU PAGINA!

Javier Marco dijo...

En la presentación del blog hay un comentario con un macro llamado "copyarypegar" que puede servirte. Solo hay que adaptarlo, quitando la parte del inputbox donde se pregunta al usuario por el código del cliente, y sustituyéndolo por las personas que sí estudian.

Un saludo.

Anónimo dijo...

es exactamente lo que necesito, lo probe con un archivo que tengo mas o menos asi:

523 41001
524 41003
526 41011
41019
527 41019
529 41008
530 41005
533 41007

Pero despues de inspecionar la fila con el dato 526 se queda en la segunda columna, como puedo hacer para que siga inspecionando desde la primera columna?.
534 41006

chachelo dijo...

Excelente!!!! funciona de maravillas

EDU25 dijo...

JAVIER MARCO
una consulta,

como puedo hacer para eliminar filas iguales(osea con el mismo número dentro de la celda)y dejar la primera celda activa(ojo que solo quiero eliminar las filas repetidas y dejar la primera activa) por ejemplo dentro de un rango del A1:A100.

Además quiero restringir que no se eliminen las celdas iguales que tengan el nombre HE05 a la derecha.

Por ejemplo al ejecutar la macro.

A
1 2345 (activa)
2 2345 (se elimina)
3 2345 (se elimina)
4 2345 HE05 (activa)
2 2345 (se elimina)

Agradecería me puedan ayudar, muchas gracias.

Anónimo dijo...

Hola Javier,
muchas gracias por tus ayudas. He estado mirando la eliminación de las filas en blanco, pero cuando tienes una celda con borde, no la toma como vacía, sino que para la macro es como si estuviera con texto, por lo que no la borra.

Saludos,

Juan Carlos

Javier Marco dijo...

Pues yo lo acabo de probar, y funciona correctamente, incluso con celdas vacías con bordes.

¿No será que esa celda que tiene bordes, tiene espacios vacíos?. Si así fuera, ten en cuenat que los espacios vacíos son caracteres, y por tanto no borrará esas filas al encontrar algo dentro de ellas.

EDU25 dijo...

Javier Marco,

Por favor puedes contestar a mi consulta, muchas gracias.

Javier Marco dijo...

Edu25, tu consulta requeriría de un artículo entero para poder darle solución.

Anónimo dijo...

Sobre el aporte de Erik El Rojo:
La ventaja que encuentro a eliminar filas vacias utilizando F5 es que puedes deshacer los cambios, si es que te equivocaste. En cambio al utilizar la macro, no se pueden deshacer los cambios realizados (a menos claro que se cierre el libro sin guardar nada)

Jimena dijo...

Hola Javier, excelentes tus consejos!!! He revisado la página, pero no he podido encontrar la respuesta que busco: En una hoja excel tengo una columna específica que puede tener todas sus celdas llenas, como tener algunas vacías, dependiendo del usuario que llene dicha columna. En otra hoja del mismo libro, necesito listar en una columna sólo aquellas celdas que no estén vacias. ¿Se puede lograr algo asi?
Muchas gracias de antemano por tu ayuda

Javier Marco dijo...

Hola Jimena. Se me ocurre que puedes hacer lo más fácil y rápido:

1. Copiar y pegar esa columna, de la hoja 1 a la hoja 2, manualmente, o bien con un sencillo macro como este, que copia la columna B de la Hoja 1, y la pega en la columna B de la Hoja 2:

Sub ejemplillo()
Sheets("Hoja1").Select
Columns("B:B").Select
Selection.Copy
Sheets("Hoja2").Select
Columns("B:B").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub

2. En la hoja 2, aplicamos el macro explicado en este artículo (el cual puedes añadir al macro del copypaste de la columna, para tenerlo todo juntito en uno solo).

Saludos.

Bernardo dijo...

El codigo es super facil y no es tan trabajoso

Sub EliminarCeldasVacias()
'Selecciono toda la tabla
Selection.CurrentRegion.Select

'Selecciono ahora solo las celdas vacias
Selection.SpecialCells(xlCellTypeBlanks).Select
'Elimino todas las celdas vacias y corro las que tienen datos a la izquierda
Selection.Delete Shift:=xlToLeft
End Sub

Javier Marco dijo...

Hola Bernardo. Tu macro no es correcto, pues el CurrentRegion solo selecciona hasta la primera fila y/o columna vacía. Por tanto se seleeccionan filas solo con datos, y donde por tanto, todavía no hay ninguna celda vacía para eliminar.

Un saludo.

Anónimo dijo...

Hola Javier solo tengo una dudota como le puedo hacer para borrar una fila que tenga celdas vacias y celdas activas y solo queden las filas que esten completamente llenas...

@Kin3Xc dijo...

Hola no soy muy bueno en esto de las macros, pero necesito hacer algo espero que me ayuden. resulta que desarrolle una aplicacon en visual 6.0 y exporto datos a excel para generar unas grafias alli lo que quiero hacer es que al momento de exportar los datos desde visual basic me limpie toda la hoja de excel o solo un rango seleccionado. no se si esto se pueda hacer. espero que me den una mano en esto
de antemano gracias!!!

Jaime B. Valle Herrada dijo...

PODRIAS ENSEÑARME COMO CONTAR CELDAS QUE LLENAS QUE NO ESTEN OCULTAS, OSEA SUPONGAMOS K HAY 100 CELDAS LLENAS PERO QUE 30 CELDAS ESTAN OCULTAS, LA PREGUNTAS ES, QUE FUNCION USO PARA CONTAR LAS CELDAS LLENAS QUE ESTAN VISIBLES...

POSDATA, USE LA FUNCION SUBTOTALES(103,RANGO DE DATOS), PERO ME SALIO VALOR...(OSEA K NO RECONOCE)...
XFA PODRIAS AYUDARME EN ESTO.

Javier Marco dijo...

Bueno, cuando te refieres a celdas ocultas, supongo que te refieres a filas ocultas. La función CONTARA no nos sirve, pues no distingue entre filas ocultas y filas visibles.

Si lo que quieres es contar las filas con datos que no están ocultas, deberás crearte una función personalizada.

Copia y pega esto en un módulo:

Function contarllenas(rango As Range)
For Each celda In rango
If celda.EntireRow.Hidden = False And celda <> "" Then contador = contador + 1
Next
contarllenas = contador
End Function

Luego llama a la función por ejemplo así, si quieres contar las filas visibles con datos desde A1 hasta A10:

=contarllenas(A1:A10)

Saludos.

quicodunk dijo...

Hola yo tengo un problema un poco diferente, a través de este tema he aprendido a borrar las celdas vacias con su fila correspondiente y me ha sido de muchísima ayuda pues llevaba buscándolo tiempo, muchas gracias. la cosa es que yo tengo que borrar una fila de una tabla que comparte hoja con otra tabla al lado, es decir no puedo borrar la fila entera sino la fila solo de esa tabla o borraré datos de la tabla contigua.
entonces la linea
Selection.EntireRow.Delete
no la puedo usar, ¿cómo escribo que borre la fila de la tabla y no entera??
no sé si se puede, estaré muy agradecido si lo pudiésemos solucionar.

muchas gracias de antemano.

Javier Marco dijo...

No se puede. Lo que tienes que hacer en ese caso, es coger el bloque que hay desde la fila inferior a esa que quieres eliminar, y hasta el final de la tabla, y trasladarlo todo (ese bloque), a la línea que deseas machacar. Es decir, lo que tienes que hacer es trasladar el bloque de abajo a la fila que te quieres cargar.

fofo dijo...

en vez de filas es columnas como es?

Javier Marco dijo...

Prueba este macro:

Sub Eliminar_columnas_vacias()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'suprondremos que vamos a inspeccionar 100 columnas,
'en busca de todas las que haya en blanco
For i = 1 To 100
'si la celda está vacía...
If ActiveCell = "" Or IsNull(ActiveCell) Then
'nos quedamos con la celda donde estamos
'para volver a ella posteriormente
celda = ActiveCell.Address
'vamos hasta la primera celda hacia
'abajo que encontremos, con datos
Selection.End(xlDown).Select
'si está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'miramos si arriba hay datos
Selection.End(xlUp).Select
'si también está vacía esa celda
If ActiveCell = "" Or IsNull(ActiveCell) Then
'eliminamos la columna
Selection.EntireColumn.Delete
'volvemos a la celda donde estábamos
'siempre y cuando no estemos en la columna 1
If ActiveCell.Column <> 1 Then Range(celda).Offset(0, -1).Select
End If
End If
End If
'pasamos a la siguiente columna
ActiveCell.Offset(0, 1).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Saludos.