Excel - Macro lenta

 
Vista:
sin imagen de perfil

Macro lenta

Publicado por Fernando (4 intervenciones) el 11/12/2023 15:13:32
Un saludo a todos.

Tengo una macro que su función es copiar los datos desde la columna F9010 en adelante hasta encontrar un vacío y pegarlos uno a uno en la columna B9897, cuando se cumple la condición la copia y pega en la primera celda vacía de la hoja1


Sub CopiarColumna()

Dim sh1 As Worksheet, sh2 As Worksheet
Dim i As Long, lc1 As Long, lc2 As Long, lr As Long
'
Application.ScreenUpdating = False
Set sh1 = Sheets("Hoja1")
Set sh2 = Sheets("Hoja2")
'
lc1 = 1
For i = 6 To sh2.Cells(9910, Columns.Count).End(1).Column
lr = sh2.Cells(Rows.Count, i).End(3).Row
sh2.Range(sh2.Cells(9910, i), sh2.Cells(lr, i)).Copy
sh2.Range("B9897").PasteSpecial xlPasteValues
If sh2.Range("B9896").Value > 15 Then
sh2.Range("B9894", sh2.Range("B" & Rows.Count).End(3)).Copy
sh1.Cells(1, lc1).PasteSpecial xlPasteValues
lc1 = lc1 + 1
End If
Next
Application.ScreenUpdating = False
Application.CutCopyMode = False
MsgBox "Fin"
End Sub


Cuando empecé con esta macro contaba con 1 columna de datos (B9850), 2 de referencias y 23 de formulas, hoy cuento con 18 columnas de datos mas sus referencias y 414 de formulas.

Para ver si alguien me ayuda a dejarlo en solo 23 de formulas he copiado todas las columnas de datos (B9850) en adelante a la XAA9910 en adelante para con la ayuda de una macro irlas copiando en la BN8950 una a una.

La F9910 es la que hace referencia por lo que seria primero copiar F9910 a B9897 luego copiar XAA9910 en adelante a BN8950 y repetir G9910 luego XAA9910 en adelante y así sucesivamente hasta encontrar un vacio desde su inicio en F9910.

Gracias de antemano.
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 Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro lenta

Publicado por Antoni Masana (2478 intervenciones) el 11/12/2023 22:40:08
No tengo claro lo que hace la macro pero me da la sensación que hace como aquel del chiste que pintaba la raya de la carretera y cada día pintaba menos porque le quedaba el bote más lejos.

Si subes el libro puedo hacer una macro un poco más rápida, la idea es usar dos punteros uno para leer el origen y otro para grabar en el destino y nos ahorramos que Excel este contando filas hasta la vacía, en este caso los tiempos van al revés de más lento a más rápido

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub CopiarColumna()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim i As Long, lc1 As Long, lc2 As Long, lr As Long
    '
    Application.ScreenUpdating = False
    Set sh1 = Sheets("Hoja1")
    Set sh2 = Sheets("Hoja2")
    '
    lc1 = 1
    For i = 6 To sh2.Cells(9910, Columns.Count).End(1).Column
        lr = sh2.Cells(Rows.Count, i).End(3).Row
        sh2.Range(sh2.Cells(9910, i), sh2.Cells(lr, i)).Copy
        sh2.Range("B9897").PasteSpecial xlPasteValues
        If sh2.Range("B9896").Value > 15 Then
            sh2.Range("B9894", sh2.Range("B" & Rows.Count).End(3)).Copy
            sh1.Cells(1, lc1).PasteSpecial xlPasteValues
            lc1 = lc1 + 1
        End If
    Next
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    MsgBox "Fin"
End Sub

También puede que me equivoque y siga lenta, pero por probar no se pierde nada.

Saludos.
\\//:
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Macro lenta

Publicado por Fernando (4 intervenciones) el 12/12/2023 05:13:28
Buena noche.
Gracias por responder.
Entiendo que me falto ampliar más detalladamente la información, la macro lo que hace es tomar desde la columna F9010 en adelante y pegarla una a una en la B9897 hasta encontrar un espacio vacío ya que puede haber entre 8 mil hasta 16 mil columna al lado de esta de no más de 200 filas siempre con diferente información las cuales son comparadas con la información fija de B9850 de no más de mil filas y procesadas por las 23 columnas de fórmulas(Mil filas); hasta aquí la macro no tardaba más de 10 minutos en procesar toda la información.


Como comente en el tiempo he ido añadiendo más columnas con información fija y creando sus correspondientes fórmulas que no son más que copias de la primera donde solo cambio la referencia de la columna convirtiéndolo en un libro muy pesado y ahora tarda unas 3 horas en procesar.


Pensé como la formulas son las mismas eliminar todas y dejar solo una y como todas las columnas de información fija (B9850) están separadas por 2 columnas de referencias decidí colocarlas todas sin referencia a partir de la columna XAA9010 y con la ayuda de la macro irlas pegando en la BN9850 que es la columna que las formulas van a procesar.


Lo intente pero lo que logre es F9010 con XAA9010, G9010 con XAB9010, H9010 con XAC9010…… y así sucesivamente
Cuando lo que quiero es F9010 con XAA9010 luego con XAB9010 luego con XAC9010….. y terminada la información fija seguir G9010 con XAA9010 luego con XAB9010... hasta completar las posibles 16 mil columna que le continúan a la F9010.
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 Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro lenta

Publicado por Antoni Masana (2478 intervenciones) el 12/12/2023 13:01:44
Para serte sincero no entiendo lo que me estas explicando.
Hablas de la columna F9010, esto tiene más bien pinta de referirse a una celda, es decir fila 9010 dela columna F.
A menos que utilices en estilo de referencia F1C1 es tampoco tiene sentido porque se refiere a la celda A1 y se interpreta como: Fila 1 Columna 1.

Ahora voy a intentar interpretar lo que comentas. Antes te hago una aclaración y es que a la hora de explicarnos nos olvidamos de que nuestro interlocutor desconoce por completo lo que estamos haciendo y damos por sabidas cosas que para nosotros son muy evidentes pero no para la otra persona y eso hace que sea díficil entendernos.

Tomo el primer párrafo e interpreto en negrita:

Entiendo que me falto ampliar más detalladamente la información, la macro lo que hace es tomar desde la columna F9010 desde la columna F fila 9010 en adelante y pegarla una a una en la B9897 en la columna B fila 9897 hasta encontrar un espacio vacío ya que puede haber entre 8 mil hasta 16 mil columna al lado de esta de no más de 200 filas Interpreto que desde la celda indicada se copia filas, hasta 200, y entre 8 y 16 mil columnas siempre con diferente información las cuales son comparadas con la información fija de B9850 de no más de mil filas y procesadas por las 23 columnas de fórmulas(Mil filas); hasta aquí la macro no tardaba más de 10 minutos en procesar toda la información.

La parte última que habla de comparar me he perdido.

Entiendo que lo que quieres copiar es un rango de celdas entre 1.600.000 (200 filas por 8.000 columnas) y 3.200.000 (200 filas por 16.000 columnas) y además filtras el contenido de las celdas, es decir solo copias las que cumplen una determinada condición.

Esto rápido no va a ser. Pero analizando los datos y lo que quieres hacer quizás se pueda optimizar la fórmula.
O utilizar funciones que permiten copiar rangos de datos pero solo están en las últimas versiones de Excel.

Sin el libro poco puedo hacer para ayudarte.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Macro lenta

Publicado por Fernando (4 intervenciones) el 14/12/2023 01:48:43
Interpreto que desde la celda indicada se copia filas, hasta 200, y entre 8 y 16 mil columnas


(Todo esto es correcto), A modo de ejemplo tengo la columna celda F fila 9010 hasta F fila 9030, la columna celda G fila 9010 hasta G fila 9111, la columna celda H fila 9010 hasta H fila 9118 y así sucesivamente, pueden haber desde 1 hasta 16.000 columnas todas siempre en la misma fila 9010 (por lo regular en esta fila 9010 siempre hay más de 8.000 columnas y menos de 16.000 columnas y cada día las filas que contienen estas columnas varían de tamaño) ,(Todo esto ocurre en la hoja 2)


Cada una de estas columnas empezando siempre por la columna celda F Fila 9010 que es el origen independientemente de la cantidad de filas que contengan se copian y pegan siempre en la columna celda B Fila 9897 que es el destino y cuando la condición del cálculo es verdadera (Celda B fila 9896) entonces se copia la columna celda B fila 9894 con tantas filas contenga esta columna y se pega en la primera celda vacía que encuentre de la hoja 1 (celda A fila 1, luego la celda B fila1, celda C fila 1)….y así hasta agotar del origen tantas columnas haya en las fila 9010 de la hoja 2 (se agota cuando encuentre la primera columna que no contenga información)

Hasta aquí es lo que logra hace la Macro que envié.


Desde aquí lo que quisiera añadir a la Macro


(Me acabo de dar cuenta que la macro no es lenta sino que el libro lo he ido cargando y es muy pesado) para poder eliminar 400.000 celdas y aligerar el libro necesitaría añadir a la macro para que haga lo siguiente, empezando por dar los datos de donde estará ubicado el otro origen con su destino (en la misma fila 9010 pero en la columna XAA conteniendo esta posiblemente unas 1000 filas XAA fila 9011, XAA fila 9012…luego la columna XAB fila 9010 con las mismas características que la columna XAA fila 9010, luego la columna XAC fila 9010 … hasta encontrar una columna que no contenga información) todo esto último entre paréntesis es el nuevo origen que quiero añadir y pegar en el destino columna BN fila 8950.


Ahora tengo 2 orígenes el primero que ya estaba y empieza en la columna F fila 9010 con destino en la columna B fila 9897 que lo llamare “origen A” y el segundo que es el nuevo y empieza en la columna XAA fila 9010 con destino en la columna BN fila 8950 que lo llamare “origen B”

Teniendo la información donde están ubicados los orígenes y sus destino necesito que después de pegar en su destino la primera columna del “Origen A” se empiecen a pegar en su destino todas las columnas del “origen B” cuando no haya más columnas en el “origen B” se repite el mismo proceso pero con la segunda columna del “origen A” y todas las columnas del “Origen B”, nuevamente la tercera columna del “origen A” con todas las columnas del “origen B” y así sucesivamente hasta que no haya más columnas en el “origen A”
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 Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro lenta

Publicado por Antoni Masana (2478 intervenciones) el 14/12/2023 23:44:10
Sin ver el libro y entender que hace la macro no puedo ayudarte.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Macro lenta

Publicado por Fernando (4 intervenciones) el 15/12/2023 02:05:03
Gracias por su atención y paciencia
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