Macro para eliminar determinadas filas

Buenas chicos, y ante todo gracias por vuestra atención.
Tengo un problema con una hoja y después de intentar buscar la solución me he decidido a preguntaros a ver si podéis darme alguna idea.
El caso es que la grabadora de macros de excel la se utilizar y la verdad es que me da muy buenos resultados en muchas ocasiones, el problema es que mi control del VBA es muy limitado y quería saber como poder hacer lo siguiente:
El caso es que el programa de gestión de mi empresa me saca un listado de cientos de lineas en formato xls pero sin ningún tipo de formato y claro, cada vez que saco dicho listado me paso un montón de tiempo aplicándole formato para su mejor comprensión. El listado presenta una cabecera que se repite n veces cada cierto intervalo de lineas, y mi misión es mantener la primera cabecera y eliminar el resto de ellas repetidas, no se si me explico.. El caso es que lo he intentado con la grabadora de macros pero es una tarea larguísima y no del todo eficiente ya que cada una tiene una longitud y formato diferente.
Resumiendo, que lo necesitaría es crear una macro, mediante la cual, deje las primeras 70 filas intactas, y a partir de ahí elimine 13 filas y mantenga las 60 siguientes, elimine 13 y deje las 60 siguiente, elimine 13 y deje 60, y así sucesivamente hasta que llegue al final de la tabla...
Ufff.. No se yo si será algo muy complejo, pero la verdad es que le he estado dando mil vueltas y no encuentro la solución...
¿Alguien me podría ayudar?
Un millón de gracias por adelantado...

1 respuesta

Respuesta
1
Prueba con esta macro. Creo que hace lo que quieres (tienes que poner el nombre de la página que contiene el listado).
Option Explicit
Sub borrarCabecerasPaginaListado()
    Const nombreHojaListado = "Hoja1" ' Tienes que poner el nombre real de la página
    Const numLinIni = 70    ' Nº de líneas iniciales a conservar
    Const numLinSig = 60    ' Nº de líneas de las páginas sucesivas
    Const numLinBorrar = 13 ' Nº de líneas a borrar entre páginas
    Dim sh As Worksheet
    Dim i As Long
    Dim ultimaFilaDatos As Long
    Dim aux As String
    Set sh = Sheets(nombreHojaListado)
    ultimaFilaDatos = sh.Cells.SpecialCells(xlCellTypeLastCell).Row ' última línea
    i = numLinIni + 1 ' Primera línea a borrar
    Do While i <= ultimaFilaDatos
        aux = Format$(i) & ":" & Format$(i + numLinBorrar - 1)
        sh.Rows(aux).Delete
        i = i + numLinSig
    Loop
    MsgBox "Proceso terminado"
End Sub
Muy buenas y mil gracias, Santiago!
La verdad es que después de darle mil vueltas está es la macro perfecta!
Con anterioridad había probado a hacer:
Sub Borrar13Filas()
Dim i As Long, n As Long
Application. ScreenUpdating = False
n = Cells(65536, 1). End(xlUp). Row
For i = 71 To n Step 60
Range(Cells(i + 1, 1), Cells(i + 13, 1)). EntireRow. Delete
Next i
Application. ScreenUpdating = True
End Sub

Pero claro, al irse eliminando lineas, las mismas se van desplazando hacia arriba, y al no coincidir la cuenta elimina las lineas que no son...
Entonces varié, y lo hice eliminando desde abajo...
Variando:
For i = 71 To n Step 60
Range(Cells(i + 1, 1), Cells(i + 13, 1)). EntireRow. Delete

Y poniendo esto:
For i = n To 71 Step -61
Range(Cells(i + 1, 1), Cells(i + 13, 1)). EntireRow. Delete

Me situaba en la ultima fila y ejecutaba.. pero me encontgraba dos problemas: el primero es que la ultima página (a veces con listados con cientos de ellas..) no siempre está completa y ya se me fastidió el tema.. y el segundo es que a pesar de que lo he hecho sobre "páginas regulares" no se porqué, siguen sin salir...
Por eso tu macro me ha venido perfecta! Eres un crack! mil gracias por la molestia..;)
Y aprovechando y abusando aun más de tu conocimiento... en esa misma hoja, tengo una macro para eliminar filas con un texto determinado:
Sub elimina_condicion()
Dim rngString As Range
Do
Set rngString = Columns("a").Find("LISTAR", MatchCase:=False, LookAt:=xlPart, LookIn:=xlValues)
If Not rngString Is Nothing Then
rngString.EntireRow.Hidden = True
End If
Loop Until rngString Is Nothing
End Sub

El caso es que no siempre es la palabra "LISTAR" la que se busca, y claro, modificar cada vez que sucede la macro es una lata.. ¿sabrías alguna manera de que aparezca un cuadro de texto y te pregrunte cual es la palabra condicionada? ... Lo he probado intentando insertar un InputBox, pero no se si es que no lo permite la acción Find o es que estoy introduciéndolo con la nomenclatura errónea pero siempre me da un error y no me funciona...
Lo dicho, mil gracias por la fantástica respuesta y mil más pro las molestias!
En cuanto tengo un instante esta tarde, ya cierro y puntúo, por supuesto con la más alta nota!
Gracias, Santiago!
Xandre
OU
Prueba definiendo una variable, leyéndola con un inputbox y buscar la variable.
Definirla:
    Dim textoBuscar as string
Leer el contenido
    textoBuscar = inputBox("Texto a Buscar")
    if textoBuscar="" then exit sub ' Por si has pulsado cancelar
Buscar el texto (igual que lo que tienes cambiando un poquito)
    Set rngString = Columns("a").Find( textoBuscar , MatchCase:=False, LookAt:=xlPart, LookIn:=xlValues)
Te dejo como tarea (creo que poco complicada) el reconstruir tu macro con estas variaciones.
Por cierto, tu macro oculta la fila. Si lo que quieres es borrarla utiliza el 'delete', aunque si es para imprimir te servirá lo mismo.
Hola de nuevo Santiago, y de nuevo gracias, no veas lo que estoy aprendiendo y practicando gracias a tus fantásticas explicaciones.
He hecho la "tarea" que me has encomendado pero creo que lo he hecho mal, bueno, es obvio que lo he hecho mal. He probado con lo siguiente:
Sub elimina_condicion()

Dim textoBuscar as string
textoBuscar = inputBox("Texto a Buscar")
if textoBuscar="" then exit sub ' Por si has pulsado cancelar
Set rngString = Columns("a").Find( textoBuscar , MatchCase:=False, LookAt:=xlPart, LookIn:=xlValues)
If Not rngString Is Nothing Then
rngString.EntireRow.Hidden = True
End If
Loop Until rngString Is Nothing
End Sub

Pero me da un error en el bucle, en el Loop, me abre el compilador de VB y señalándome el "End if" me dice:
Error de compilacion: End If sin Bloque IF
antes incluso de aparecerme en Inputbox para la palabra buscada. Eso significa que no ha encontrado ningun If para esa orden de End If... pero no sería: if textoBuscar="" then exit sub ' Por si has pulsado cancelar tal como tu me indicaste???
He probado quitandole el Loop:
Dim textoBuscar as string
textoBuscar = inputBox("Texto a Buscar")
if textoBuscar="" then exit sub ' Por si has pulsado cancelar
Set rngString = Columns("a").Find( textoBuscar , MatchCase:=False, LookAt:=xlPart, LookIn:=xlValues)
If Not rngString Is Nothing Then
rngString.EntireRow.Hidden = True
End Sub

Y funciona, me pide el input, el introduzco el texto y me lo hace correctamente, pero obviamente, al no haber bucle, una vez que elimina la primera fila en la que aparece la palabra buscada, se para...
¿Se te ocurre que puedo hacer?
Lo siento mucho, tus indicaciones son clarísimas, pero como podrñas observar soy un perfecto novato en la materia, perdón por dar tanto la lata y gracias por tu paciencia!
Xandre
OU
A ver, el primer código que pones no tiene la instrucción 'Do', por lo que el 'loop until...' estaría de más.
Te he modificado un poco el código para dejarlo... ¿un poco más claro? Espero que sí.
Option Explicit ' Para que si una variable no está definida de error y nos obligue a definirla
Sub elimina_condicion()
    ' Interesa definir siempre las variables que vas a usar
    Dim textoBuscar As String
    Dim rngString As Range
    textoBuscar = InputBox("Texto a Buscar", "Ocultar filas con un texto determinado")
    If textoBuscar = "" Then Exit Sub ' Por si has pulsado cancelar
    Do
        ' Primero buscamos el texto indicado
        Set rngString = Columns("a").Find(textoBuscar, MatchCase:=False, LookAt:=xlPart, LookIn:=xlValues)
        If rngString Is Nothing Then Exit Do ' Si no lo encuentra termina el bucle
        rngString.EntireRow.Hidden = True ' Oculta la fila
    Loop
End Sub
Yeah! Santiago, un millón de gracias, todo perfecto!
Ha sido una ayuda fantástica, en serio, mil gracias por todas tus molestias!
Por supuesto la puntuación máxima a pesar de lo difícil que te lo he puesto por mi ineptitud...;)
Un saludo, SAntiago!
X
oU

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas