# eliminar filas



## speed_methal (May 14, 2010)

Buenas a todos, soy nuevo en excel y necesito realizar una operación con macros. Estoy aprendiendo el lenguaje VBA pero aún desconozco gran parte del mismo. 
He de eliminar ciertas filas de la siguiente configuración.
En la celda A3 empieza mi columna como sigue:
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
0.11
0.12
.
.
.
y necesito transformarla en esta:
0
0.04
0.08
0.12
.
.
.
es decir dejar una y eliminar tres
He generado una macro rudimentaria que lo hace pero son muchisimos datos y tarda un montón.

Sub EliminaFilasDesplazamientos()
'Elimina filas alternas (pares o impares) de modo que se eleminen los tiempos
'intermedios generados por la doble interpolación al pasar de aceleración a
'a desplazamiento
ultimacelda = 10007
'Número de la fila que contiene el último valor de la columna
Do Until n = 2
n = n + 1
For i = 4 To ultimacelda
    Cells(i, "A").EntireRow.Delete
    '4 se refiere al numero de la celda siguiente a la de t = 0.
Next i
Loop
End Sub

Mis dudas son si hay alguna manera de hacer esto de un sólo barrido para reducir el tiempo de ejecución. A modo de aprendizaje; la fila hasta la que se ha de hacer la operación la meto a pelo. Habría alguna manera de definir la variable ultimacelda para que sea el número de la última celda de la columna A que tiene información?? ya que en el primer bucle no se pierde tiempo, reduciéndose las filas a la mitad; pero en el segundo bucle la variable ultimacelda hace que se ejecute todas las filas anteriores suponiendo un extra de tiempo inecesario.

Espero me podais ayudar.
Saludos a todos


----------



## mjrofra (May 23, 2010)

Hola,

de pronto puedas evitar el bucle y usar filtro avanzado. Suponiendo que tus datos están en la Hoja1, en la columna A y empiezan en A1, esto insertará una nueva columna B con el resultado que buscas:


```
Sub Prueba()
    
    Application.ScreenUpdating = False
    
    With Sheets("Hoja1")
        .Range("b:c").Insert
        .Range("b2").Formula = "=mod(row(a1),4)=0"
        .Columns(1).AdvancedFilter 2, .Range("b1:b2"), .Range("c1")
        .Columns(2).Delete
    End With
    
    Application.ScreenUpdating = True
    
End Sub
```


----------



## speed_methal (May 23, 2010)

muchas gracias funciona perfectamente. soy nuevo con las macros te importaría explicarme que significan los comandos y el funcionamiento que tienen en esta macro,
de nuevo gracias


----------



## mjrofra (May 23, 2010)

Hola de nuevo,

Me alegra que haya funcionado la macro.

Acá copio nuevamente la macro con algunos comentarios para que te sea más fácil entenderla.

Para entenderla del todo, tendrás que empaparte un poco de filtros avanzados y entender la función Residuo y como la he usado acá (prueba ingresando la fórmula =residuo(fila(a1);4)=0 en B1 y copiala hacia abajo para que te hagas una idea de lo que está haciendo):


```
Sub Prueba()
    
    'Desactiva la actualización de pantalla
    Application.ScreenUpdating = False
    

    'La hoja con la que vamos a trabajar
    With Sheets("Hoja1")

        'Inserta dos columnas al lado de la columna A
        'Esto solo es por si hay datos al lado de tus datos,
        'para no sobreescribirlos.
        .Range("b:c").Insert

        'Ingresa la fórmula =RESIDUO(FILA(A1);4)=0 en la celda B2
        'Esta es la fórmula que se va a usar para el filtro avanzado
        .Range("b2").Formula = "=mod(row(a1),4)=0"

        'Aplica el filtro avanzada para extraer los datos según la
        'fórmula (criterio) en B2 y copia el resultado de la extracción
        'en la columna C
        .Columns(1).AdvancedFilter 2, .Range("b1:b2"), .Range("c1")

         'Borra la columna B que contiene el criterio de extracción para
         'el filtro avanzado
        .Columns(2).Delete

    End With
    
    'Activa la actualización de pantalla
    Application.ScreenUpdating = True
    
End Sub
```

En todo caso, puedes ver lo que va haciendo la macro paso a paso si la ejecutas con F8 desde el Editor de Visual Basic.


----------



## speed_methal (May 24, 2010)

De nuevo gracias, eres un crack


----------



## Greg Truby (May 26, 2010)

Una solución bastante elegante, mjrofra.  Me gustó.


----------



## mjrofra (May 26, 2010)

Gracias por tu comentario Greg, me alegra recibirlo y más viniendo de ti. Me impulsa a seguir aprendiendo :D.


----------

