domingo, 11 de diciembre de 2011

Eliminar filas con cierta periodicidad

Descargar el fichero: elimina_filas.xlsm

Para eliminar filas que se repiten con cierta periodicidad hemos diseñado una macro. Es frecuente que al importar informes de otras aplicaciones obtengamos un texto plano que al volcarse a Excel lleva muchas líneas de "basura" que deseamos eliminar. Si las filas que deseamos suprimir se repiten de forma periódica podemos utilizar la macro que explicaremos seguidamente.

Ya habíamos hablado de eliminar filas y columnas vacías en otro post:

Eliminar Filas y Columnas vacias

En esta ocasión lo que pretendemos es eliminar ciertas filas que se repiten periódicamente.


En nuestro ejemplo disponemos de un texto que comienza en la fila 4, donde se alternan algunas filas que nos resultan válidas (color azul) y otras que nos resultan inútiles (color rojo). La macro se lanza pulsando el botón que hemos incrustado, y lo primero que hace es preguntarnos por la primera fila válida, y finalmente nos pregunta por la segunda fila válida. La propia macro calcula el final del texto en esa hoja y procede a eliminar las filas inútiles.

La macro no la hemos colocado en un módulo como es habitual sino en ThisWorkbook. Véase la imagen siguiente.



Es importante observar que la macro comienza a eliminar de abajo hacia arriba, ya que en caso contrario, se iría alterando el número que ocupan las filas, al ser eliminadas.


Código:

Sub elimina_filas_inutiles()
Dim primera As Long
Dim segunda As Long
Dim ultima As Long
Dim i As Long
primera = InputBox("Indique la primera fila válida", , 4)
segunda = InputBox("Indique la segunda fila válida", , 11)
ultima = ActiveCell.SpecialCells(xlLastCell).Row
For i = ultima To primera Step -1
    If (i Mod (segunda - primera)) - primera <> 0 Then
        Cells(i, 1).EntireRow.Delete
    End If
Next i
End Sub

La clave del proceso está en el operador Mod que es el módulo. En español se denomina resto, que se corresponde con la función RESIDUO de Excel.

9 comentarios:

  1. Funciona perfecto y a la primera, muchísimas gracias por la info, me has salvado :)

    Un saludo!

    ResponderEliminar
  2. La macro elimina de x a x por igual, es decir, Ej. de A2 a A6, de A7 a A11, de 4 en 4 hasta el final del texto.
    Si son 5000 filas con texto en la hoja, de 4 en 4 elimina.
    Podria hacerse segun condicion?, talves si si fuera el mismo texto en las celdas inutiles (creo yo)

    ResponderEliminar
  3. Muchas gracias por la Macro. acabo de aplicarla y funciona perfecto!! es justo lo que necesitaba. muchas gracias por el tiempo de hacerla y publicarla!!!! estoy feliz!!

    ResponderEliminar
  4. Estimado Adolfo, me han resultado sumamente útiles sus explicaciones, pero no puedo resolver un problema particular, se lo presento por si puede ayudarme.
    Tengo varios libros de una sola hoja en .csv que forman un libro con tantas hojas como .csv tengo, en las cuales realizo varios cálculos. Como es bastante periódico el proceso me obliga a abrir cada .csv, copiar las columnas de la A a la H y reemplazar las correspondientes del libro resumen. Necesito una macro que corra en el libro de destino y que copie esas columnas del .csv y reemplace las de la hoja correspondiente.
    Lamento haberme extendido en la explicación y agradezco desde ya cualquier ayuda que pueda brindarme.

    Alejandro.

    ResponderEliminar
  5. Hola Alejandro Spais.

    Envíame los ficheros a financieras@gmail.com y una explicación más detallada de lo que quieres hacer.

    Un cordial saludo.

    Adolfo Aparicio

    ResponderEliminar
  6. Hola Alejandro Aparicio:

    Me parece de mucha utilidad lo que compartes, muchas gracias por compartir la información. Yo tengo un problema en particular te comento por si es posible me puedas ayudar:

    Tengo en una columna la información :
    1
    1
    No util
    No util
    No util
    No util
    1
    1
    No util
    No util
    No util
    No util
    1
    1

    La idea es eliminar las filas no útiles como lo planteas pero la dificultad es como conservar las filas útiles que en este caso no es solo uno, sino 2 o mas periódicamente.

    Muchas gracias por tu apoyo!

    Josue

    ResponderEliminar
  7. Hola josuej.

    La siguiente macro soluciona el caso que planteas. Espero te resulte útil.

    Sub elimina_filas_inutiles2()
    Dim primera As Long
    Dim segunda As Long
    Dim ultima As Long
    Dim n As Long 'nº de útiles juntas
    Dim i As Long
    primera = InputBox("Indique la primera fila válida", , 4)
    n = InputBox("Indique cuantas filas válidas van juntas", , 2)
    segunda = InputBox("Indique la segunda fila válida", , 10)
    ultima = ActiveCell.SpecialCells(xlLastCell).Row
    For i = ultima To primera Step -1
    If (i Mod (segunda - primera)) - primera < 0 Then
    Cells(i, 1).EntireRow.Delete
    End If
    Next i
    End Sub

    ResponderEliminar
  8. Adolfo felicitarte x las macros, tengo una consulta, es cierto tenemos datos que exportamos a excel de un sistema contable CONCAR que tiene cabeceras de productos, cantidad, debe y haber. necesito repetir los nombre productos debajo de cada fila por la cantidad de ventas e importes que se hacen te mando a tu correo

    ResponderEliminar
  9. Hola Isaac.

    Las filas que quieres eliminar debe tener una periodicidad conocida para poder crear una macro que elimine las filas de forma masiva y automática.

    Si no existe tal periodicidad debes marcarlas de forma manual. Para hacer esta marca puedes añadir una columna y poner un carácter en las filas que deseas conservar. Otro método para marcarcarlas consiste en dotarlas de un cierto color de fondo.

    Luego con el Filtro puedes filtrar por color o por el carácter que pusiste. Las filas que superan el filtro las guardas en otra hoja, y así ya tienes eliminadas las filas que no te interesan.

    Un saludo.

    ResponderEliminar