Mejorar la velocidad de una macro

Tengo una macro cuya función es recorrer toda la Columna C de una hoja de excel hasta la ultima celda con un valor, luego mediante Offset baja 5 celdas e inserta los datos de un formulario, este es el código para una mayor claridad

Private Sub btnacp_Click()
Sheets("ITEMS").Select
Range("C7").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(4, 0).Select
Loop
ActiveCell = lblelab.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = cbxelb.Value
ActiveCell.Offset(1, -1).Select
ActiveCell = lblrev.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = cbxrev.Value
ActiveCell.Offset(1, -1).Select
ActiveCell = lblfch.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = DTPfch.Value
ActiveCell.Offset(1, -1).Select
ActiveCell = lblinf.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = txtinf.Value
ActiveCell.Offset(1, -1).Select
ActiveCell = lblusu.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = txtusu.Value
ActiveCell.Offset(1, -1).Select
ActiveCell = lbleqp.Caption
ActiveCell.Offset(0, 1).Select
ActiveCell = txteqp.Value
ActiveCell.Offset(1, -1).Select
End Sub

El problema al que le quiero dar solucion es la velocidad, ya que por la cantidad de datos que tengo 
(8879 filas) se demora mucho para recorrer la columna, y no le doy celdas especificas para insertar los valores ya que ese numero de filas puede crecer o decrecer, así que si alguien sabe como puedo modificar el código para que sea más veloz le agradecería mucho si me ayudara.

1 Respuesta

Respuesta
1

Tu programación tiene dos problemas usas un do while y demasiados select eso alentá las macros, para lo que quieres hay formas más eficientes de hacerlo, por ejemplo esta macro hace lo mismo que tu macro solo que se va directo al final de los registros que tengas y se salta dos lugares más abajo crea una área de 6 filas por 2 y en esa área añade los datos, cada que corras la macro hará lo mismo sin importar si añades o quitas filas

Sub analizar()
Set datos = ActiveSheet.UsedRange
With datos
    f = .Rows.Count
    Set campos = .Rows(f + 3).Resize(6, 2)
   With campos
    .Select
    .Cells(1, 1) = lblelab.Caption:   .Cells(1, 2) = cbxelb.Value
    .Cells(2, 1) = lblrev.Caption:    .Cells(2, 2) = cbxrev.Value
    .Cells(3, 1) = lblfch.Caption:    .Cells(3, 2) = DTPfch.Value
    .Cells(4, 1) = lblinf.Caption:     .Cells(4, 2) = txtinf.Value
    .Cells(5, 1) = lblusu.Caption:    .Cells(5, 2) = txtusu.Value
    .Cells(6, 1) = lbleqp.Caption:    .Cells(6, 2) = txteqp.Value
End With
End With
Set datos = Nothing: Set campos = Nothing
End Sub

Te agradezco mucho por la ayuda, este código es justo lo que necesitaba y tendré en cuenta lo que me dices de usar muchos Select y empezaré a ser más cuidadoso con eso, de nuevo muchas gracias.

James Bond Hola, acabo de notar algo y es que cada vez uso la macro me pone los datos cada vez más abajo, incluso si borro los anteriores los datos siguen y siguen bajando cada vez que hago uso de la macro

No entiendo, la macro hace lo que tu macro hace, tu macro se va a la ultima fila de datos deja dos filas en blanco después de ella e inserta los datos de tu formulario, la macro que te envíe hace exactamente lo mismo, cuenta las filas con información, se va a la ultima con datos, deja dos filas en blanco e inserta la información de tu formulario, las volví a probar y hacen exactamente lo mismo, seria mejor que subieras una pantalla de tu información para ver que puede estar pasando

Si veo la ejecución paso a paso ve que a f lo hace igual a 8952, pero los datos actualmente acaban en 8886, como lo puedo ajustar para que no se vaya tan lejos?

James Bond, ya vi el problema y es que uno de lo datos que envió a las celdas es una fecha, así que aunque lo borre en la celda queda guardado el formato de fecha y por eso el rango se baja cada vez más 

En lugar de borrar puedes eliminar las filas o filas con eso se va el formato de la fecha

Cambia las dos primeras líneas de la macro por esta

n = ActiveSheet.Cells(Rows.Count, "c").End(xlUp).Row
Set datos = Range("c7").Resize(n - 6, 2)

Como ves en el recuadro sombreado están los datos que la macro selecciona

en esta otra imagen ves el resultado final de la macro (si quieres puedes eliminar los select son solo para mostrarte con que datos trabaja la macro)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas