jueves, 7 de agosto de 2008

Eliminar Filas con Macro

Para eliminar filas alternas, bien sean las pares o bien las impares, se puede utilizar esta macro.




Sub EliminaFilas()
'Elimina filas alternas (pares o impares)
For i = 5 To 3000
    Cells(i, "A").EntireRow.Delete
Next i
End Sub


El contador i va de uno en uno ya que al eliminar una fila la que se encontraba en la siguiente posición alterna, ahora es ha convertido en contígua.

Cells(fila, columna). En este caso ponemos la columna A, en lugar de con el número 1, que es lo habitual, lo hacemos con la expresión "A".

Comenzamos en i=5, esto hace que se eliminen las filas impares que comienzan en la fila 5. Si hubiéramos puesto i=6 entonces se comenzaría en la fila 6 y se eliminarían las filas pares.

Si quieres hacer una prueba puedes obtener las cotizaciones de algún valor del Ibex desde la página de Invertia. Verás que al pasarlo a Excel te quedan filas en blanco interpuestas entre las filas que contienen las cotizaciones. Puedes probar la macro para eliminar las filas en blanco. Para ello elige un valor de Ibex y en 'Cotizaciones históricas' podras ver una tabla con los datos de las cotizaciones. Esta tabla la puedes seleccionar con el ratón, copiay y pegar en Excel. Otro inconveniente es que vienen muchos objetos incrustados que puedes eliminar con F5 (ir a), Especial, Objetos y luego pulsa la tecla Suprimir, de esta forma eliminaras todos estos molestos objetos.

19 comentarios:

  1. Hola, quise realizar una prueba y al ejecutarla me indica un error de compilación: No se ha definido Sub o Function, qué hago?

    ResponderEliminar
  2. Hola Antonio.

    Una macro comienza por 'Sub' y finaliza con 'End Sub', encontrándose entre ambas sentencias las líneas de programa.

    Comprueba que la macro cumple esos requisitos. Si olvidamos poner alguna de esos comandos, o ponemos alguno de más, surge el error que comentas.

    Un saludo.

    Adolfo Aparicio

    ResponderEliminar
  3. Hola Adolfo, muchas gracias, por error borre el end, ya quedo perfecta.

    Gracias desde Ciudad de México.

    ResponderEliminar
  4. Buenas... Quisiera hacerte una pregunta relacionada. Estoy tratando de borrar filas de texto que se encuentran entre medio de parrafos bien delimitados. El archivo puede abrirse sin problema en cualquier programa office, es solo texto. En realidad es un subtitulo en el cual quiero borrar la fila que se encuentra en inglés ya que logré borrar la que está en castellano usando el buscar y reemplazar de word con comodines, pero no logro dar con el grupo de comodines para eliminar la fila en ingles. La razón es que quiero obtener dos subtitulos independientes sin tener que hacer el borrado a mano.
    El archivo tiene el siguiente formato en cada parrafo de igual manera:

    1
    00:01:02,700 --> 00:01:06,978
    Christmas comes but once a year
    (La Navidad llega una vez al año)

    2
    00:01:07,060 --> 00:01:11,338
    For every girl and boy
    (para cada niño y niña.)

    3
    00:01:11,380 --> 00:01:15,658
    The laughter and the joy
    (La risa y la alegría)

    Son 592 parrafos de ahi mi renuencia a hacerlo a mano.

    Gracias de antemano, saludos

    ResponderEliminar
  5. Hola.
    Si quieres eliminar filas que se encuentran de forma periódica en un texto largo, puedes probar esta macro:

    Sub EliminaFilas()
    'Elimina filas una de cada cuatro 'comenzando en la fila 5
    For i = 5 To 3000
    Cells(i+3,"A").EntireRow.Delete
    Next i
    End Sub

    Comienza eliminando la fila 5 ya que hemos escrito 'i=5'

    Elimina una fila cada cuatro filas, ya que hemos puesto 'i+3'.

    Pruebalo modifica estas dos variables para que se ajuste a tus necesidades.

    Un saludo.

    Adolfo Aparicio

    ResponderEliminar
  6. Muchas gracias, funcionó perfectamente.
    Saludos

    ResponderEliminar
  7. Estimado:

    Te escribo para solicitarte ayuda con lo sgte.

    tengo un archivo como este a continuación

    2.4 m 2.7 m 3.0 m 3.3 m 3.6 m 3.9 m Totals
    APE 38_120 0 0 0 0 0 3 3
    0 0 0 0 0 0.06 0.06
    APE 38_135 0 0 0 0 1 66 67
    0 0 0 0 0.02 1.35 1.36
    APP 38_120 0 0 0 0 1 5 6
    0 0 0 0 0.02 0.09 0.11
    APP 38_135 0 0 0 0 0 6 6
    0 0 0 0 0 0.12 0.12
    COR 44 0 0 0 0 0 1 1
    0 0 0 0 0 0.03 0.03
    M&B 38_165 0 0 0 0 1 3 4
    0 0 0 0 0.02 0.07 0.1
    M&B 38_185 0 0 0 0 0 5 5
    0 0 0 0 0 0.14 0.14
    M&B 38_192 0 0 0 0 0 2 2
    0 0 0 0 0 0.06 0.06
    M&B 38_212 0 0 0 0 0 2 2
    0 0 0 0 0 0.06 0.06
    M&B 38_225 0 0 0 0 0 1 1
    0 0 0 0 0 0.03 0.03
    M&B 38_305 0 0 0 0 0 1 1
    0 0 0 0 0 0.05 0.05
    M&B 44_152 0 0 0 0 0 2 2
    0 0 0 0 0 0.05 0.05

    es una tabla con una primera fila que comienza en C1 con encabezados de largo (2,4 mts; 3,00 mts;etc.-), en la sgte fila (A2) están los datos que deseo mantener, y en la fila sgte 3;5;7;9;etc.- están los datos que no me sirven.

    Al probar tu código...lamentablemente manda un mensaje de depuración que me lleva al editor de visual pero ha agregado más líneas al original.

    No sé cómo hacerlo y es bastante el volúmen de archivos que debo manejar de la misma manera, y entenderás que a mano es engorroso lento y cansador.

    Espero me puedas ayudar con esto, uso el office 2007 por si sirve el dato.

    Me puedes contactar en robertolatorre@gmail.com.
    Desde ya muchas gracias.

    ResponderEliminar
  8. Antonio, buenas tardes ten go un problema corrí la macro pero me sale un mensaje que dice, Se ha producido el error 28 en tiempo de ejecución.
    Espacio de pila insifuciente.
    Gracias de antemano, saludos desde Brasil

    ResponderEliminar
  9. Hola Marco Aurelio.

    El error que comentas se da habitualmente cuando se ejecuta un bucle y se produce algún problema de recursividad, por ejemplo, cuando no se consigue terminar el bucle. Otro motivo puede ser que se está ejecutando el bucle con muchos ciclos en un PC con poca memoria RAM.

    Prueba a ejecutar la macro con el FOR NEXT de 5 hasta 500, por ejemplo, y si puedes, ejecútalo en otro PC con mayor RAM.

    Puedes mirar este Post, para tomar ideas de macros que eliminan filas y columnas:

    Eliminar Filas y Columnas vacias

    ResponderEliminar
  10. Hola, tengo los siguientes subtítulos que quiero editar. Pongo un pequeño extracto:

    1
    00:00:55,055 --> 00:00:56,056
    [somber opera music]

    2
    00:00:56,056 --> 00:00:57,057
    [somber opera music]

    3
    00:00:56,056 --> 00:01:04,064
    ♪ ♪

    4
    00:01:19,579 --> 00:01:21,080
    >> BEFORE THE GAME,

    5
    00:01:21,081 --> 00:01:22,582
    >> BEFORE THE GAME,

    6
    00:01:21,081 --> 00:01:24,084
    FOR SPORTSMANSHIP, I GO OUT TO

    7
    00:01:24,084 --> 00:01:27,087
    FOR SPORTSMANSHIP, I GO OUT TO

    8
    00:01:24,084 --> 00:01:25,585
    SHAKE JOHN STARKS' HAND,

    9
    00:01:25,585 --> 00:01:27,086
    SHAKE JOHN STARKS' HAND,

    La cuestión es que la mayor parte de las líneas se repite en el tiempo dos veces y quisiera eliminarlas, porque retrasan la salida de la siguiente. Obviamente no me vale el borrado alternativo, porque no todas se repiten y ésto haría que se eliminaran algunas imprescindibles. ¿Hay forma de hacer que se borren el grupo de 3 líneas cuya última linea sea igual a la última del anterior (o siguiente) grupo de 3 líneas?
    Espero que me podáis ayudar, si me habéis entendido...
    Gracias.

    ResponderEliminar
  11. Hola buenas, ¿cómo podría eliminar filas en las que en una de sus celdas hubiese una "x"?

    Muchas gracias de antemano

    Saludos.

    ResponderEliminar
  12. 4as yo tengo el mismo problema queria borrar 2 seguidas y una no, lo resolvi con el siguiente macro

    Sub Macro1()
    ' Macro1 Macro
    For i = 1 To 30
    Cells(i + 1, "A").EntireRow.Delete
    i = i + 1
    Next
    For i = 2 To 30
    Cells(i, "A").EntireRow.Delete
    Next
    End Sub

    Ahi si quieres muevele para ver si te sirve

    ResponderEliminar
  13. Diego, tu macro me sirvio mucho.
    agradecido

    ResponderEliminar
  14. Esto les puede servir.

    Otra manera de eliminar una, dos, tres o más filas y una no, o dos no, etc, es la siguiente.

    Insertar una columna "auxiliar", dentro de esta columna deberán darle un valor x a la o las filas que desean eliminar y dejar vacías las filas que no desean eliminar; si desean eliminar las filas siguiendo un parámetro, pueden seleccionar (la o las celdas vacías y la o las celdas marcadas) y arrastrar de tal modo que se tenga marcadas todas las filas que se desean eliminar. Ahora deben seleccionar toda la columna "auxiliar" presionar F5, Especial, Constantes, ACEPTAR (Con esto tendrán seleccionadas solo las celdas de las filas que desean eliminar). Click derecho en una de estas celdas seleccionadas, click en eliminar, click en "toda la fila" y ACEPTAR.

    Este método, sin desmerecer las macros que podamos crear, es mucho más sencillo y el proceso de eliminación es inmediato, sin importar la cantidad de filas que queramos eliminar; lo que, dependiendo de la velocidad de sus procesadores, con una macro, puede demorar algunos fastidiosos segundos.

    ResponderEliminar
    Respuestas
    1. Hola Juan Carlos.
      Fantástico!!! Me ha gustado mucho el método.
      Tienes toda la razón al decir que si algo se puede solucionar sin macro y de forma sencilla siempre será mucho mejor que usar macros.
      Lo he probado y esta muy bien. El único inconveniente es que las X las tienes que poner a mano, ya que si lo haces con una fórmula SI dejando como opción en caso verdadero que ponga una X y en caso falso que ponga "". Al pulsar luego F5 y elegir Constantes lo que hace es señalar todo, ya que el valor "" lo no toma exactamente igual que una celda vacía. Tampoco es un gran inconveniente ya que luego puedes ordenar esa columna auxiliar y eliminar todas las filas que tengan X.
      Buen aporte!!!

      Eliminar
  15. Hola Juan Carlos.
    Si ponemos en la columna auxiliar una fórmula condicional SI que nos ponga las X en las celdas cuya fila deseamos eliminar y nos ponga "" en las celdas restantes, hemos visto que al seleccionar esa columna auxiliar y pulsar F5 si ponemos Constante el truco no funciona puesto que selecciona todas las celdas.

    Lo que tenemos que hacer es poner las X con la función SI y luego copiar y pegar esa columna auxiliar sobre si misma con pegado especial valores. Luego se selecciona la columna auxiliar entera y se pulsa F5. Se elige "Especial..." y "Diferencia entre columnas". Ahora ya tendremos seleccionadas únicamente las celdas que contienen la X. Finalmente pulsamos sobre el botón derecho de ratón y elegimos "Eliminar" y "Toda la fila".
    Gracias por el aporte. Me ha gustado mucho.

    ResponderEliminar
  16. Ando en buscar de dos macros..
    1. Macro para eliminar al ultima fila que contenga valores en una tabla
    2. Macro para eliminar todas las filas que contengan un valor indicado en una celda X, ej: en Hoja1, A1, contiene el valor 55, al ejecutar la macro, esta ubica el valor en la columna C de la Hoja 2 y elimina la fila, si el mismo valor esta en tres filas distintas, se eliminan las 3 filas que lo contengan...

    ResponderEliminar
  17. tengo una duda... si deseo eliminar una fila con la condición de que una cela tenga si, la celda tiene un no la fila no se eliminara... con que condicional puedo comparar la celda sin que tenga una posición precisa sino que cambie según el ciclo for?

    ResponderEliminar
  18. tengo una duda... si deseo eliminar una fila con la condición de que una cela tenga si, la celda tiene un no la fila no se eliminara... con que condicional puedo comparar la celda sin que tenga una posición precisa sino que cambie según el ciclo for?

    ResponderEliminar