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.
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
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.
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
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?
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
Gracias de nuevo. Luego en casa lo intento a ver si lo consigo!
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.