lunes, 31 de marzo de 2008

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:

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

    ResponderEliminar
  2. 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.

    ResponderEliminar
  3. 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

    ResponderEliminar
  4. 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

    ResponderEliminar
  5. 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.

    ResponderEliminar
  6. 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,

    ResponderEliminar
  7. 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

    ResponderEliminar
  8. 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

    ResponderEliminar
  9. 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.

    ResponderEliminar
  10. 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.

    ResponderEliminar
  11. 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.

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

    ResponderEliminar
  13. 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! ;)

    ResponderEliminar
  14. 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 :-)

    ResponderEliminar
  15. 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!

    ResponderEliminar
  16. 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

    ResponderEliminar
  17. ¡¡¡ Lo encontré!!!

    Basta con poner en el comparador ">"

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

    ResponderEliminar
  19. 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.

    ResponderEliminar
  20. 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 ;-)

    ResponderEliminar
  21. 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

    ResponderEliminar
  22. 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.

    ResponderEliminar
  23. Expectacular Montesama.

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

    ResponderEliminar
  24. Pues desconozco si hay cursos online de este tipo.

    Un saludo.

    ResponderEliminar
  25. 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

    ResponderEliminar
  26. 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...

    ResponderEliminar
  27. 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.

    ResponderEliminar
  28. 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.

    ResponderEliminar
  29. 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

    ResponderEliminar
  30. 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.

    ResponderEliminar
  31. 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.

    ResponderEliminar
  32. 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)

    ResponderEliminar
  33. 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.

    ResponderEliminar
  34. 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)

    ResponderEliminar
  35. 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

    ResponderEliminar
  36. 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!

    ResponderEliminar
  37. 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.

    ResponderEliminar
  38. 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

    ResponderEliminar
  39. Excelente!!!! funciona de maravillas

    ResponderEliminar
  40. 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.

    ResponderEliminar
  41. 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

    ResponderEliminar
  42. 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.

    ResponderEliminar
  43. Javier Marco,

    Por favor puedes contestar a mi consulta, muchas gracias.

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

    ResponderEliminar
  45. 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)

    ResponderEliminar
  46. 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

    ResponderEliminar
  47. 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.

    ResponderEliminar
  48. 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

    ResponderEliminar
  49. 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.

    ResponderEliminar
  50. 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...

    ResponderEliminar
  51. 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!!!

    ResponderEliminar
  52. 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.

    ResponderEliminar
  53. 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.

    ResponderEliminar
  54. 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.

    ResponderEliminar
  55. 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.

    ResponderEliminar
  56. en vez de filas es columnas como es?

    ResponderEliminar
  57. 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.

    ResponderEliminar