Hola a todos:
tengo en la columna A unas mil filas con diferentes valores numéricos. En la columna B tengo valores de texto. De la columna C en adelante tengo las 52 provincias españolas, en cada columna una provincia. Quiero hacer una macro que sea razonable en tiempo para copiar los valores de la columna A en todas las columnas de las provincias (por ejemplo, si en A2 tengo un 5, copiar ese 5 en todas las 52 columnas en la fila 2, si en A3 tengo un 7, copiarlo en todas las 52 columnas en la fila 3, etc.). Así con las mil filas que tengo con valores. Pero además, quiero que me haga el copiado solo para las filas que tengo filtradas, según el valor que yo desee de la columna B. En las filas que no se ven, no quiero copiarles nada.
¿Me podeis ayudar? He probado alguna macro haciendo un blucle For each, Next y preguntando si la fila tiene altura, pero tarda demasiado tiempo. No es viable.
Muchas gracias
Supongo que copias una vez y pegas de golpe en las 52 celdas, es decir, sólo un pegado por fila.
Imagino que has seguido los trucos habituales para reducir tiempos de ejecución de macros largas: fundamentalmente desactivar la actualización de pantalla, desactivar el cálculo automático. Hay varios temas del foro sobre estos temas de rendimiento, por ejemplo:
http://www.necesitomas.com/macro-lenta
http://www.necesitomas.com/ejecutar-macro-mayor-rapidez
Sobre el bucle de las 1000 filas (que tampoco son muchas) ...
Lo mejor es que adjuntes tu código para que lo podamos ver y podamos proponer alguna alternativa o ver si hay algo especilmente extraño.
------
Ya sé Excel, pero necesito más.
Hola:
Se me olvidó decir que las columnas (provincias) no van contiguas. Hay una columna vacía entre ellas que no puede contener nada.
Sub Copiar()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim col, fil As Integer
Set InputRng = ActiveSheet.Range("A2:A1000")
col = 3
For col = 3 To 105
For fil = 2 To 1000
If ActiveSheet.Cells(fil, 1).EntireRow.RowHeight > 0 Then
ActiveSheet.Cells(fil, 1).Copy
ActiveSheet.Cells(fil, col).PasteSpecial
End If
Next
col = col + 1
Next col
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
No entiendo por qué dejas una columna vacía entre medias.
Bueno, tampoco entiendo esta organización de tus datos, pero bueno, supongo que tendrás otros condicionantes.
Estás haciendo tus bucles primero recorriendo una columna, copiando cada valor y pegándolo, y luego pasas a la siguiente columna.
esto hace que copies y pegues muchas veces.
prueba a anidar los bucles al revés, primero recorres todas las columnas, y luego cambias a la siguiente fila, de modo que copies sólo una vez y pegues muchas. algo así:
Sub Copiar_retocado()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim col, fil As Integer
For fil = 2 To 1000
If ActiveSheet.Cells(fil, 1).EntireRow.RowHeight > 0 Then
ActiveSheet.Cells(fil, 1).Copy
For col = 3 To 105 Step 2
ActiveSheet.Cells(fil, col).PasteSpecial
Next
End If
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
------
Ya sé Excel, pero necesito más.
Hola pacomegia. La organización de los datos que tengo es algo complicado de explicar. Las columnas entre las provincias tienen otra serie de datos que no vienen al caso. He puesto el resumen que funcionalmente es idéntico.
Va mucho mejor, tarda mucho menos. Tu razonamiento ahorra muchas copys.
Voy a hacer más pruebas de cuanto tarda según lo que filtre. No sé si habría forma de depurarlo algo más.
Muchas gracias
Un error que yo he cometido durante muchos años y que es muy extendido es almacenar los datos de la misma manera que se quieren presentar. Hace algún tiempo que abogo por una alternativa: almacenar los datos en formato tabla (como si fuera una base de datos) y posteriormente localizarlos para hacer la presentación aparte.
Este sistema funciona mucho mejor, es más fácil de trabajar, más fácil de entender por la máquina, y al final aporta los mismos resultados (el mismo informe), pero con mucho menos trabajo.
Otra práctica que intento desterrar es la de utilizar ficheros anuales, o distintas pestañas para distintos meses. Es mejor meter todos los datos juntos, como dije antes, con una columna con la fecha que nos permita posteriormente clasificar los datos para hacer la presentación del mes correspondiente.
Solo contesto para apuntar esto. Un buen trabajo con lápiz y papel antes de empezar con el archivo ahorra mucho trabajo inútil posteriormente. Sé que en la mayoría de las ocasiones no es posible, pero sería deseable.
Un saludo