Copiar y pegar sin pasar por cada celda

8 envíos / 0 nuevos
Último envío
luismigueldelepe
Imagen de luismigueldelepe
Offline
última acción: Hace 5 años 6 meses
alta: 20/07/2018 - 07:44
Puntos: 245
Copiar y pegar sin pasar por cada celda

Muy buenas a todos y todas. Tengo una macro sencilla en la que copio dos columnas de una hoja y me interesa que luego se peguen los comentarios en otras 11 hojas. La manera más fácil es seleccionar la siguiente hoja, pegar, seleccionar la siguiente, pegar, etc. Pero claro, la macro se ejecuta en más de 30 segundos! ¿Sería posible que vaya pegando en las hojas si tener que ir seleccionándolas?

El código que tengo es éste:

Sub comentarios_cambiantes

Sheets("UDI1").Select

    Range("A1:B1470").Select

    Selection.Copy

    

    Sheets("UDI2").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI3").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI4").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI5").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI6").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI7").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI8").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI9").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI10").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

    

    Sheets("UDI11").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

        

    Sheets("UDI12").Select

    Range("A1:B1470").Select

    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _

        SkipBlanks:=False, Transpose:=False

    

End Sub

Por cierto, también me gustaría que luego se protegiesen (sin contraseña). En mi código no he puesto la línea de proteger hoja porque si va protegiendo, no sé si el copiado del portapapeles luego no puede usarse en un pegado especial al ejecutar una orden entre el copiado y el pegado.

Gracias por la ayuda por adelantado.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Pues es bastante más sencillo

Pues es bastante más sencillo de lo que piensas. Tienes que declarar una variable como Variant, y a esta variable le asignamos del tirón todo el rango de datos de la primera hoja. Luego simplemente vamos asignando del tirón a cada rango en cada hoja la variable.

Aunque el código se puede mejorar mucho, te dejo algo que funciona:

Sub comentarios_cambiantes()
dim rango as Variant

Sheets("UDI1").Activate
rango = 
Range("A1:B1470").Value
Sheets("UDI2").Range("A1:B1470") = rango
.
.
.
Sheets("UDI12").Range("A1:B1470") = rango
end sub

Una manera de mejorarlo puede ser recorrer las pestañas con un bucle, por ejemplo.

 

Un saludo

luismigueldelepe
Imagen de luismigueldelepe
Offline
última acción: Hace 5 años 6 meses
alta: 20/07/2018 - 07:44
Puntos: 245
Muchas gracias por el aporte.

Muchas gracias por el aporte. Puede ser que yo esté haciendo algo mal, pero a mí no me funciona. No me da error, pero no me copia y pega los comentarios. SI funcionara sería la caña. Gracias.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Este código se debe poner en

Este código se debe poner en un módulo independiente, no en los módulos vinculados a las hojas o al libro.

De todas maneras, si pudieras aportar el libro donde no funciona (previamente límpialo de "cosas" que no es necesario que otros vean), podríamos ver qué hace para que no funcione.

También lo puedes ver tú ejecutando paso a paso (tecla F8) y viendo qué está haciendo en cada momento nuestro amigo el Excel.

 

Un saludo

luismigueldelepe
Imagen de luismigueldelepe
Offline
última acción: Hace 5 años 6 meses
alta: 20/07/2018 - 07:44
Puntos: 245
Creo que copia el valor de

Creo que copia el valor de las celdas, pero no el comentario. ¿en vez de .Value se puede poner otra cosa para coger el comentario solo? 

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Efectivamente, copia solo el

Efectivamente, copia solo el valor.

Si necesitas copiar fórmulas u otras cosas entonces tu copy/paste funciona mejor.

De todas maneras, puedes probar con un bucle que recorra cada celda y lo copie a un array, y luego otro bucle para colocar cada cosa en su sitio. el comentario de cada celda está en:

cells(1,5).comment

range("E1").comment

Ambas expresiones son equivalentes, pero con la primera es más sencillo trabajar en bucles.

 

Un saludo

luismigueldelepe
Imagen de luismigueldelepe
Offline
última acción: Hace 5 años 6 meses
alta: 20/07/2018 - 07:44
Puntos: 245
Gracias de nuevo. Luego en

Gracias de nuevo. Luego en casa lo intento a ver si lo consigo!

luismigueldelepe
Imagen de luismigueldelepe
Offline
última acción: Hace 5 años 6 meses
alta: 20/07/2018 - 07:44
Puntos: 245
Subo un archivo de ejemplo.

Subo un archivo de ejemplo. Se trataría de copiar la columna A y B (solo los comentarios) y pegarlos (como comentarios también) en las demás hojas. Este excel es simple, pero el original son 1470 filas, en dos columnas y en 12 hojas. Claro, el copiar y pegar especial funciona, pero al ir hoja por hoja se ralentiza mucho (tarda unos 20 segundos) y creo que podría hacerse mucho más rápido. Si sabes programarlo Cron, o algún otro colaborador, os lo agradecería mucho.