Macro de borrado de celdas (Excel 2007)

Tengo una macro que me resulta lenta en la ejecución debido al término que incluyo en el código "Application.calculation=xlCalculationAutomatic". El problema es que si la suprimo se desactivan las fórmulas que tengo en las columnas "B" y "D". Os transcribo el código:

Application.Calculation = xlCalculationAutomatic

For Each Celda In Range("A10:A19,C10:C19,E10:E19" & UltFila)

If (Celda.Value > 0) Then Celda.ClearContents
Next Celda

End Sub

2 Respuestas

Respuesta
2

Puedes hacer lo siguiente:

Si los cálculos ya están realizados, entonces apaga el cálculo

Application.Calculation = xlCalculationManual

De esta forma cada vez que borras una celda no se tienen que recalcular las fórmulas, puede ser así:

Apagas el cálculo al principio de tu marco y cuando terminas de limpiar las celdas vuelves a prender el cálculo:

    Application.Calculation = xlCalculationManual
    '
    For Each Celda In Range("A10:A19,C10:C19,E10:E19" & UltFila)
        If (Celda.Value > 0) Then Celda.ClearContents
    Next Celda
    '
    Application.Calculation = xlCalculationAutomatic

Ahora en tu macro tienes una situación en esta línea

For Each Celda In Range("A10:A19,C10:C19,E10:E19" & UltFila)

Lo que dice tu línea es: para cada celda en los rangos A10:A19,C10:C19,E10:E19, hasta ahí todo bien, pero después del E19" tienes esto: "& UltFila.

Entonces si tu última fila vale, por ejemplo 500, entonces el último rango va a ser :

De E10 hasta E19 & 500, es decir:

De E10 hasta E19500

Entonces la macro va a revisar hasta la celda E19500 (diecinueve mil quinientos).

Si tu intención es revisar de E10 a E19, entonces quita esto: "& UltFila".

Te quedaría así:

For Each Celda In Range("A10:A19,C10:C19,E10:E19")

Prueba la opción 1, luego prueba la opción 2 y luego prueba las 2 opciones juntas.

Si todavía es lento prueba con esta tercera opción:

'Por. Dante Amor 
    Application.Calculation = xlCalculationAutomatic
    Set r = Range("A10:A19,C10:C19,E10:E19" & UltFila)
    Set b = r.Find(0, lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            Set b = r.FindNext(b)
            b.Value = ""
        Loop While Not b Is Nothing And b.Address <> ncell
    End If

Incluso puedes combinar la tercera opción con las opciones 1 y 2.

'Por.Dante Amor
    Application.Calculation = xlCalculationManual
    Set r = Range("A10:A19,C10:C19,E10:E19" & UltFila)
    Set b = r.Find(0, lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            Set b = r.FindNext(b)
            b.Value = ""
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
    Application.Calculation = xlCalculationAutomatic

o así

'Por.Dante Amor
    Application.Calculation = xlCalculationManual
    Set r = Range("A10:A19,C10:C19,E10:E19")
    Set b = r.Find(0, lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            Set b = r.FindNext(b)
            b.Value = ""
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
    Application.Calculation = xlCalculationAutomatic

Prueba todas las opciones y si todavía es lento revisamos otra opción.

Saludos. Dante Amor

No olvides valorar la respuesta.

Ya me corrigieron la macro de la opción 3, lo que estoy haciendo es buscar el valor = 0 y lo que necesitas es que sea mayor a 0.

Entonces olvida las macros de la opción 3 y prueba con las opciones 1 y 2.

Hola Dante:

Todos los códigos de macro presentados son operativos pero...sigo teniendo el mismo problema de lentitud (tarda 24 segundos en finalizar).

Gracias de todas formas por tu ayuda.

Probaste la segunda opción así, esto sin duda va más rápido, ya que lo hace menos veces y los cálculos están apagados

Application.Calculation = xlCalculationManual
For Each Celda In Range("A10:A19,C10:C19,E10:E19")

¡Gracias! Dante por tu respuesta. Al final el fallo estaba en que tenía activadas miles de filas que no necesitaba (inoperantes) y que la macro se tomaba su tiempo para recorrer innecesariamente puesto que como he dicho eran innecesarias.

Lo vió otro colaborador al que le envié el libro con las macros y detectó ahí el problema.

No obstante, a tí también te agradezco las diversas alternativas de solución que me distes.

Pero con probar esta línea la macro funciona rápido

For Each Celda In Range("A10:A19,C10:C19,E10:E19")

El problema es que tenías & Ultfila

¡Gracias! Sí, efectivamente sobraba & Ultfila, además de un sin fin de filas innecesarias activadas que hacían que la macro las recorriese

Respuesta
1

No sabemos como son las fórmulas de las columnas B y D. Las instrucciones de la macro que has escrito son muy pocas luego no tendrían que tardar nada en hacerse.

Lo mejor sería que me mandases el fichero a

[email protected]

Así veré como se puede mejorar la velocidad, tal vez puedan mejorarse las fórmulas esas.

Tiene razón Dante, habría que saber que rango quieres borrar exactamente porque ese

& UltFila

Se te ha escapado del control, seguramente querías hacer una cosa y está haciendo otra. Luego sería bueno precisar cuál es el rango que quieres que se borre y corregirlo. Tal vez con eso ya no tengas el problema de lentitud.

Y si después de corregido el rango de borrado aun fuera lenta o la quisieras rápida a más no poder puedes hacer la de desactivar el cálculo automático mientras se ejecuta la macro y luego activarlo. Aunque no es una cosa que se suela hacer, porque la lentitud normalmente viene cuando se están procesando muchas más celdas de las que pensábamos.

Sigo abierto a que mandes el libro si quieres.

¡Gracias!

Supongo que será más factible que te envie el archivo y así ves las fórmulas y su ubicación y compruebas in situ problemilla de procesamiento.

Te lo envio.

Yo veo que la hoja "SAVETICKETS" tiene 36394 filas activas aunque no se empleen

Y la hoja "TICKET" 15657 filas

Pues ahora dame tiempo para estudiar ...

Yo no le veo ningún problema de funcionamiento a la hoja, ¿ya se corrigió antes de mandármela?

Al menos la parte de borrar el ticket que era la que preguntabas ahora no le veo que tarde nada.

Se puede hacer alguna mejora pero sin importancia y no tendrá ninguna diferencia significativa con lo que tienes ahora.

He hecho que mandara mensajes cada vez que ejecutaba una línea de la macro. Entonces he visto que la línea que le hace perder el tiempo es esta

Application.Calculation = xlCalculationAutomatic

Quita esa línea y la otra

Application.Calculation = xlCalculationManual

Que no se necesitan para nada.

Por cierto, valoraste la pregunta antes de terminar, agradecería si puedes cambiar la puntuación normal por excelente.

Una respuesta "excelente". Llevaba mucho tiempo tratando de resolver esa lentitud en la macro y finalmente el sr. Valero Angel ha dado con el fallo y era algo que a veces obviamos y es que había una multitud de filas inoperantes que no me servían para nada y que la macro se tomaba su tiempo en recorrer puesto que estaban activas.

Muchísimas gracias a este experto colaborador.

Añade tu respuesta

Haz clic para o