Macro super lenta, es mi código o mi maquina

Resulta que he sacado un código de alguna macro por allí para ayudarme en una tarea, en el archivo original trabaj rápido, pero en mi libro es muy lenta, 4-8 segundos para cumplir su trabajo, adjunto

******************

Sub Add_dbProductListSales()
'
' Add_dbProductListSales Macro
'
'
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
    Sheets("dbListSales").Select
    Range("A3:J3").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Range("C3").Select
    Sheets("dbSales").Select
    Range("F5").Select
    Selection.Copy
    Sheets("dbListSales").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("dbSales").Select
    Range("F3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("dbListSales").Select
    Range("D3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("dbSales").Select
    Range("D7:D8").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("dbListSales").Select
    Range("E3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
    Range("G3").Select
    Sheets("dbSales").Select
    Range("C12:F12").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("dbListSales").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B3").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = _
        "=IF(AND(RC[1]=dbSales!R[2]C[4],'dbListSales'!RC[1]='dbListSales'!R[1]C[1]),SUM('dbListSales'!R[1]C+1),""1"")"
    Range("B3").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A3").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=RC[2]&RC[1]"
    Range("A3").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets("dbSales").Select
    Range("C12").Select
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub

1 respuesta

Respuesta
1

H o la: Te anexo la macro con algunos cambios:

Sub Add_dbProductListSales_2()
'Act.Por.Dante Amor
    ' Add_dbProductListSales Macro
    '
    Application.ScreenUpdating = False
    '
    Set h1 = Sheets("dbListSales")
    Set h2 = Sheets("dbSales")
    h1.Range("A3:J3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
    With h1.Range("A3:J3").Borders
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    '
    h1.Range("C3") = h2.Range("F5")
    h1.Range("D3") = h2.Range("F3")
    h1.Range("E3") = h2.Range("D7")
    h1.Range("F3") = h2.Range("D8")
    h1.Range("G3") = h2.Range("C12")
    h1.Range("H3") = h2.Range("D12")
    h1.Range("I3") = h2.Range("E12")
    h1.Range("J3") = h2.Range("F12")
    h1.Range("B3").FormulaR1C1 = _
        "=IF(AND(RC[1]=dbSales!R[2]C[4],RC[1]=R[1]C[1]),SUM(R[1]C+1),""1"")"
    h1.Range("B3").Value = h1.Range("B3").Value
    h1.Range("A3").FormulaR1C1 = "=RC[2]&RC[1]"
    h1.Range("A3").Value = h1.Range("A3").Value
    '
    Application.ScreenUpdating = True
End Sub

Si tienes macros en los eventos de tu hoja "dbListSales", entonces agrega esta línea, Pero si no tienes macros en la hoja, entonces no agregues la línea.

Application.EnableEvents = False

Si tienes muchas fórmulas en la hoja "dbListSales", entonces agrega esta línea, Pero si no tienes fórmulas en la hoja, entonces no agregues la línea; por lo que veo no tienes fórmulas, ya que las fórmulas que creas se sustituyen por valores, entonces no es necesaria la línea.

Application.Calculation = xlCalculationManual

También revisa en la hoja "dbListSales", si no hay muchas celdas con blancos después de la última celda con datos. Si es así lo preferible es que crees una hoja nueva, copies de la hoja "dbListSales" solamente las celdas que tienen información y la pegues en la nueva hoja, borres la hoja "dbListSales"; y la nueva hoja la renombres con "dbListSales". De esa forma quedará depurada tu hoja.

Prueba la nueva macro y  me comentas.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Gracias

Es impresionante como se puede reducir un código, excelente gracias, te comento al respecto.

Veras aun con la reducción del código el problema persistía, aunque hace lo mismo si, por alguna razón no me actualiza una pequeña tabla que tengo al momento de ejecutar la macro, también que gracias a ti he descubierto el problema, resulta que dices al final de tu texto que vuelva a crear la hoja con todo lo que lleva, lo hice y puff la macro otra vez es rápida, entonces este es el problema, ahora no comprendo porque es de esta manera, aun cuando en dicha hoja no hay ni tan solo un registro, entonces como prevenir esto a futuro, hasumiendo que es una db que se llenara de registros

Te adjunto la hora para que la compares, la uno es la original, y la 2 es la tuya

https://drive.google.com/open?id=1EIOXigkwYSE6DUf6PwFF722nXNBMziZ46AJKpFqQiJM 

Saludos y gracias

https://drive.google.com/drive/folders/0B7WFri-Njdu6U3BRSG9lVUUwYVk 

Lo mejor sería agregar los nuevos registros después del último registro con datos.

Lo que hace la macro es insertar una fila.

H1. Range("A3:J3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

Eso ocasiona que cada vez la macro sea más lenta, ya que recorre todos los registros hacia abajo.

 Ya que resolvimos el problema de la macro lenta.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Gracias por tu tiempo

Dime, antes de finalizar el post, pudistes observar mi archivo, dime por que en tu codigo que me achicastes en la pequeña lista que ves al momento de agregar cada registro en mi codigo si se actualiza, pero con tu codigo no actualiza

Saludos y nuevamente gracias

No puedo descargar archivos.

¿Tienes macros en los eventos de tu hoja?

Antes de ejecutar mi macro, revisa que los cálculos estén en automático, para asegurarte pon esta línea en mi macro

Application.Calculation = xlCalculationAutomatic

sal u dos

Nuevamente gracias, te agradecería si revisas el excel, si no puedes ni modo, he probado lo que eme indicas y nada, sigo con el pequeño problemita, por si acaso te paso los link

Sin no necesitas descargar el archivo en línea

https://drive.google.com/open?id=1EIOXigkwYSE6DUf6PwFF722nXNBMziZ46AJKpFqQiJM 

Sin necesitas descargar el archivo

https://drive.google.com/drive/folders/0B7WFri-Njdu6U3BRSG9lVUUwYVk 

Saludos

No puedo descargar archivos.

Puedes seguir utilizando tu macro, el problema era lo lento de la macro, pero eso se resolvió depurando tu hoja.

Ahora, no entiendo qué le falta a mi macro o qué quieres que le revise.

Tal vez le falta algo a mi macro, si quieres que la revise envíame tus archivos a mi correo. Pero eso es independiente a la pregunta original.

Valora la respuesta para continuar con las revisiones.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “levip” y el título de esta pregunta.

¡Gracias! 

Hola ya valore tu respuesta gracias,

No se porque razon se pierde el formato de la mayoria de celdas cuando lo hago con tu macro, como siempre de antemano gracias

Solamente pon el formato en cada columna en la nueva hoja.

Hola

Que hacer para que la macro que me enviaste no proceda si hay algunas celdas vacías, osea obligar al usuario a introducir datos en ciertas celdas

Saludos

Revisa los ejemplos:

Sub Add_dbProductListSales2()
'---
'   Por.Dante Amor
'---
    ' Add_dbProductListSales2 Macro
    '
    Application.ScreenUpdating = False
    '
    Set h1 = Sheets("dbListSales2")
    Set h2 = Sheets("dbSales2")
    '
    'Ejemplo para validar
        If h2.Range("F5") = "" Then
            MsgBox "Enter Invoice number", vbCritical, "DATA"
            Exit Sub
        End If
        If h2.Range("D7") = "" Then
            MsgBox "Enter Code", vbCritical, "DATA"
            Exit Sub
        End If
    '
    h1.Range("A3:J3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
    With h1.Range("A3:J3").Borders
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    '
    h1.Range("C3") = h2.Range("F5")
    h1.Range("D3") = h2.Range("F3")
    h1.Range("E3") = h2.Range("D7")
    h1.Range("F3") = h2.Range("D8")
    h1.Range("G3") = h2.Range("C12")
    h1.Range("H3") = h2.Range("D12")
    h1.Range("I3") = h2.Range("E12")
    h1.Range("J3") = h2.Range("F12")
    h1.Range("B3").Formula = "=IF(AND(RC[1]=dbSales2!R[2]C[4],RC[1]=R[1]C[1]),SUM(R[1]C+1),""1"")"
    h1.Range("B3").Value = h1.Range("B3").Value
    h1.Range("A3").Value = h1.Range("C3").Value & h1.Range("B3").Value
    '
    Application.ScreenUpdating = True
End Sub

sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas