Optimizar codigo

08/02/2006 - 17:17 por Rantamplan | Informe spam
Buenas grupo!
tengo un fragmento de codigo que copia el contenido de un rango de una
hoja en otro rango de otra hoja.
El codigo funciona sin problemas, pero tarda unos 3 minutos en ejecutarse
y el problema es que ese mismo fragmento de codigo lo tengo que repetir 3
veces mas! por lo que llega a estar en ejecución durante 15 minutos! no
se el codigo es el siguiente:

inicio copy&paste
Dim i As Long, j As Long
j = 61
'activamos la hoja
MEDIAS.Activate
'medias para HCL
For i = 3 To 482
MEDIAS.Cells(i, 3) = HCL.Cells(j, 3)
MEDIAS.Cells(i, 5) = HCL.Cells(j, 6)
MEDIAS.Cells(i, 7) = HCL.Cells(j, 9)
j = j + 60
Next i
fin copy&paste

me parece que un bucle del tipo For no es lo mas indicado para esta
operación, pero no se me ocurre otra forma de hacerlo, bueno si, copiando
los rangos directamente a saco, pero no se si seria muy buena idea
:-)

Salu2!.

Preguntas similare

Leer las respuestas

#1 jose
08/02/2006 - 17:51 | Informe spam
Genera una macro copiando y pegando el rango completo. Primero la columna 3,
despues la 5 y despues la 7. Ahi verás el código que necesitas.
Aún sin depurar, esto es tal como lo genera el generador, notarás una gran
mejoría.



"Rantamplan" escribió en el mensaje
news:
Buenas grupo!
tengo un fragmento de codigo que copia el contenido de un rango de una
hoja en otro rango de otra hoja.
El codigo funciona sin problemas, pero tarda unos 3 minutos en ejecutarse
y el problema es que ese mismo fragmento de codigo lo tengo que repetir 3
veces mas! por lo que llega a estar en ejecución durante 15 minutos! no
se el codigo es el siguiente:

inicio copy&paste
Dim i As Long, j As Long
j = 61
'activamos la hoja
MEDIAS.Activate
'medias para HCL
For i = 3 To 482
MEDIAS.Cells(i, 3) = HCL.Cells(j, 3)
MEDIAS.Cells(i, 5) = HCL.Cells(j, 6)
MEDIAS.Cells(i, 7) = HCL.Cells(j, 9)
j = j + 60
Next i
fin copy&paste

me parece que un bucle del tipo For no es lo mas indicado para esta
operación, pero no se me ocurre otra forma de hacerlo, bueno si, copiando
los rangos directamente a saco, pero no se si seria muy buena idea
:-)

Salu2!.
Respuesta Responder a este mensaje
#2 Rantamplan
09/02/2006 - 09:25 | Informe spam
"jose" Escribió el día mié 08 feb 2006 05:51:47p:

Genera una macro copiando y pegando el rango completo. Primero la
columna 3, despues la 5 y despues la 7. Ahi verás el código que
necesitas. Aún sin depurar, esto es tal como lo genera el generador,
notarás una gran mejoría.



"Rantamplan" escribió en el mensaje
news:
Buenas grupo!
tengo un fragmento de codigo que copia el contenido de un rango de
una hoja en otro rango de otra hoja.
El codigo funciona sin problemas, pero tarda unos 3 minutos en
ejecutarse y el problema es que ese mismo fragmento de codigo lo
tengo que repetir 3 veces mas! por lo que llega a estar en ejecución
durante 15 minutos! no se el codigo es el siguiente:

inicio copy&paste
Dim i As Long, j As Long
j = 61
'activamos la hoja
MEDIAS.Activate
'medias para HCL
For i = 3 To 482
MEDIAS.Cells(i, 3) = HCL.Cells(j, 3)
MEDIAS.Cells(i, 5) = HCL.Cells(j, 6)
MEDIAS.Cells(i, 7) = HCL.Cells(j, 9)
j = j + 60
Next i
fin copy&paste

me parece que un bucle del tipo For no es lo mas indicado para esta
operación, pero no se me ocurre otra forma de hacerlo, bueno si,
copiando los rangos directamente a saco, pero no se si seria muy
buena idea
:-)

Salu2!.








Buenas,
gracias por la respuesta, pero no es lo que me vale...
te comento los motivos:
La macro grabada realiza las siguientes operaciones:

inicio copy&paste
Sheets("HCL").Select
Range("C61").Select
Range("C61,C121").Select
Range("C121").Activate
Range("C61,C121,c181").Select
Range("C181").Activate
Range("C61,C121,C181,C241").Select
Range("C241").Activate
Range("C61,C121,C181,C241,C301").Select
Range("C301").Activate
Sheets("MEDIAS").Select
Range("C3:C6").Select
fin copy&paste

Y el problema que se plantea es que el rango que va creciendo (con un
incremento de 60 filas si observas) tiene que llegar hasta la celda
numero 28801 !!

Resumiendo: debe coger el rango "C61:C28801" y pegarlo en el rango
"C3:C480" de una hoja, volver a coger el rango "F61:F28801" y pegarlo en
el rango "E3:E480", volver a coger el rango "I61:I28801" y pegarlo en el
rango "G3:G480".
Esas operaciones tardan en ejecutarse en torno a 1 minuto y medio, que no
es nada alarmante, pero tengo que repetir esas operaciones 9 veces mas!!
que entonces si que estamos ahblando de un tiempo considerable (en torno
a los 15 minutos!).
El problema creo que radica en el uso de un bucle tipo FOR, mi idea es
coger el rango grande, ("C61:C28801") copiar en una matriz temporal y
pegarlo en el rango de destino, eso creo que reduciría el proceso, pero
no se muy bien como implementar dicha operación.

Se admiten sugerencias ;-)
Salu2!.
Respuesta Responder a este mensaje
#3 KL
09/02/2006 - 11:23 | Informe spam
Hola Rantamplan,

A mi el siguiente codigo me tarda menos de un segundo.

Saludo,
KL

Sub test()
Dim i As Long, j As Long
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
j = 1
'medias para HCL
With MEDIAS
For i = 3 To 482
j = j + 60
.Cells(i, 3) = HCL.Cells(j, 3)
.Cells(i, 5) = HCL.Cells(j, 6)
.Cells(i, 7) = HCL.Cells(j, 9)
Next i
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationManual
End With
End Sub
Respuesta Responder a este mensaje
#4 KL
09/02/2006 - 11:35 | Informe spam
Hola de nuevo,

De hecho, si en las columnas [C], [F] y [I] de la hoja HCL las unicas formulas son las medias que se pretenden extraer, entonces no
hace falta ni el bucle ni la congelacion de pantalla ni nada - el macro seria rapidisimo de la siguiente manera:

' inicio copy&paste
Sub test()
On Error Resume Next
With MEDIAS
HCL.Range("C:C").SpecialCells(xlCellTypeFormulas).Copy
.Range("C3").PasteSpecial xlPasteValues
HCL.Range("F:F").SpecialCells(xlCellTypeFormulas).Copy
.Range("E3").PasteSpecial xlPasteValues
HCL.Range("I:I").SpecialCells(xlCellTypeFormulas).Copy
.Range("G3").PasteSpecial xlPasteValues
End With
End Sub
' fin copy&paste

Saludos,
KL
Respuesta Responder a este mensaje
#5 KL
09/02/2006 - 11:44 | Informe spam
Aunque por si acaso casi mejor asi:

' inicio copy&paste
Sub test()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
On Error Resume Next
With MEDIAS
HCL.Range("C:C").SpecialCells(xlCellTypeFormulas).Copy
.Range("C3").PasteSpecial xlPasteValues
HCL.Range("F:F").SpecialCells(xlCellTypeFormulas).Copy
.Range("E3").PasteSpecial xlPasteValues
HCL.Range("I:I").SpecialCells(xlCellTypeFormulas).Copy
.Range("G3").PasteSpecial xlPasteValues
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationManual
End With
End Sub
' fin copy&paste

Saludos,
KL
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida