Excel - Macro muy lenta, ayuda a simplificar

   
Vista:

Macro muy lenta, ayuda a simplificar

Publicado por Luis zona.lerh@gmail.com (5 intervenciones) el 09/07/2014 18:35:11
Hola buen día a tod@s:
Espero que me puedan ayudar para hacer una macro más eficiente:
Son cuatro empresas, 2 libros por cada empresa un balance y estado de resultados, estos archivos se bajan en TXT del sistema y les pongo el nombre de Balance Provisional 1, 2, 3 y 4 cualquiera que se el caso o la empresa y el estado de resultados es lo mismo solo que con el nombre Resultados.
Los archivos ya vienen con el ancho delimitado, asi que solo se abren con Excel y lo exporto a mi libro llamado Consolidado, ya que lo exporte, en el primero que es el balance provisional 1, las columnas C, D y E las corto y las inserto al final en las columnas AM, AN, AO (para no dejar las columnas en blanco le doy instertar celdas costadas porque son el saldo acumulado y no me sirven), después de eso inserto la siguiente formula en la nueva columna E "=SI.ERROR(B2+C2-D2,D2)" hasta la fila 1800 de esa misma columna, después de eso copio y pego ese rango con formulas en las columnas H, K, N, Q, T, W, Z, AC, AF, AI, AL, terminado ese proceso copio todo la hoja Balance Provisonal 1 y la pego en una hoja llamada "Balance Empresa 1" y el mismo proceso es para las empresas 2, 3 y 4, esas hojas estan ligas con la función BUSCARV a una sola Hoja llamada "BG consolidado".
Para la Hoja 2 que es el estado de resultados, solo exporto a mi libro consolidado, y después de eso solo copio lo de la Hoja "Resultados 1" y la pego en una Hoja llamada "ER Empresa 1" y así para la demás empresas. y esas hojas también estan ligas a una Hoja llamada "ER consolidado" con la función "BUSCARV".
Al final elimino las Hojas Balance Provisional 1 y Resultados 1, y asi con las hojas de las otras empresas, eso de copiar y pegar en otras hojas lo hago porque si eliminó la hoja "Balance Empresa 1" o "Resultados 1 me marca error en mis formulas de "BUSCARV"
la macro es la siguiente:


Sub PRUEBA()
Windows("Balance provisional PRUEBA.txt").Activate
Sheets("Balance provisional PRUEBA").Move before:=Workbooks( _
"CONSOLIDADO.xlsm").Sheets(1)
Windows("Resultados PRUEBA.txt").Activate
Sheets("Resultados PRUEBA").Move before:=Workbooks("CONSOLIDADO.xlsm"). _
Sheets(1)
Sheets("Balance provisional PRUEBA").Select
Columns("C:E").Select
Selection.Cut
Range("A1").Select
Selection.End(xlDown).Select
Range("A1").Select
Selection.End(xlToRight).Select
ActiveCell.Offset(0, 1).Range("A1").Select
Selection.Insert Shift:=xlToRight
' Formulas_balanza Macro_3
Sheets("Balance provisional PRUEBA").Select
Range("E2:E1800").Select
Selection.FormulaR1C1 = "=IFERROR(RC[-3]+RC[-2]-RC[-1],RC[-1])"
Selection.Copy
Range("H2").Select
ActiveSheet.Paste
Range("K2").Select
ActiveSheet.Paste
Range("N2").Select
ActiveSheet.Paste
Range("Q2").Select
ActiveSheet.Paste
Range("T2").Select
ActiveSheet.Paste
Range("W2").Select
ActiveSheet.Paste
Range("Z2").Select
ActiveSheet.Paste
Range("AC2").Select
ActiveSheet.Paste
Range("AF2").Select
ActiveSheet.Paste
Range("AI2").Select
ActiveSheet.Paste
Range("AL2").Select
ActiveSheet.Paste
' Mover_balanza_4 Macro
Sheets("Balance provisional PRUEBA").Select
Selection.CurrentRegion.Select
Selection.Copy
Sheets("PRUEBA Balanza").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("Resultados PRUEBA").Select
Range("A1").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("PRUEBA ER").Select
Range("A1").Select
ActiveSheet.Paste
Sheets(Array("Balance provisional PRUEBA", "Resultados PRUEBA")). _
Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JuanC

Macro muy lenta, ayuda a simplificar

Publicado por JuanC juanc2942@gmail.com (1053 intervenciones) el 09/07/2014 20:52:38
no me voy a poner a optimizar el código pero te doy 2 ideas:
1) en lugar de seleccionar, copiar y pegar, podrías usar directamente
el método Copy del objeto Range
ejemplo: Selection.Copy Destination:=Range("b2")

2) si estás trabajando con macros quizá no haga falta usar fórmulas,
directamente hacé todo por código

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro muy lenta, ayuda a simplificar

Publicado por Luis (5 intervenciones) el 09/07/2014 22:04:27
Hola JuanC,
Antes que nada te agradezco mucho que hayas contestado mi consulta, y disculpa mi ignorancia en esto es abismal, me podrías explicar Selection.Copy Destination:=Range("b2") que no sé cómo utilizarlo al igual que lo de la formula que me comentas,
En verdad muchas gracias.

Saludos desde México.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

Macro muy lenta, ayuda a simplificar

Publicado por JuanC (1053 intervenciones) el 09/07/2014 22:09:16
intuyo que usaste la grabadora entonces...
el código
Selection.Copy Destination:=Range("b2")
se explica por sí solo... te recomiendo que leas en la ayuda sobre el método Copy
y lo de no usar fórmulas, pues olvídalo... pensé que sabías algo de programación...

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro muy lenta, ayuda a simplificar

Publicado por Luis (5 intervenciones) el 09/07/2014 22:51:28
Gracias de todos modos de agradezco.

Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro muy lenta, ayuda a simplificar

Publicado por Juanjo (494 intervenciones) el 10/07/2014 10:05:05
Muy buenas.
El problema es que mientras se realiza tiene que ir efectuando muchos cálculos, porque, seguramente, tienes el cálculo automático. Si es así, bastaría con deshabilitarlo mientras se ejecuta y también deshabilitar la actualización de pantalla, dentro de la propia macro y verás que la velocidad se multiplica extraordinariamente. Se trata de dejar tu macro tal y como está, añadiendo dos líneas al principio y otras dos al final. Quedaría de la siguiente forma:


Sub PRUEBA()
Application.ScreenUpdating = False
Application.Calculation = xlManual

.......

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub

Ya dirás si es lo que necesitas.

Un saludo. Juanjo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Macro muy lenta, ayuda a simplificar

Publicado por Luis (5 intervenciones) el 10/07/2014 17:13:06
Sr. Juanjo es usted un genio, me ha ayudado mucho está opción, muchas gracias por la información.

Saludos desde México!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar