TL;DR —
Worksheet.Copyusa la misma posición conBefore:=/After:=que usas para Add, pero con dos diferencias que pillan a todo el mundo. Primera: no devuelve nada —no existeSet ws = sheet.Copy—, así que agarras la copia recién hecha a través deActiveSheeten la línea siguiente. Segunda, y esta es la gorda:ws.Copysin destino no copia dentro del libro, sino que crea un libro completamente nuevo que contiene la copia. Pasa siempre unBeforeo unAftersalvo que un archivo nuevo sea exactamente lo que quieres.
Sub DuplicateTemplate()
Dim src As Worksheet, copy As Worksheet
Set src = ThisWorkbook.Worksheets("Template")
src.Copy After:=ThisWorkbook.Worksheets(Worksheets.Count) ' duplica al final
Set copy = ActiveSheet ' la copia ahora esta activa
copy.Name = "Template " & Format(Now, "hhmmss") ' renombrala de inmediato
End Sub
Worksheet.Copy es el código que hay detrás de clic derecho en una pestaña ▸ Mover o copiar ▸ Crear
una copia. Es la forma en que las macros de informes estampan una hoja nueva a partir de una
plantilla cada mes. Es también el método más sorprendente de toda la familia de gestión de hojas,
porque la llamada «obvia» —Sheets("Template").Copy sin argumentos— hace algo completamente distinto
de lo que sugiere el nombre.
Lo que aprenderás
- El modelo mental —
Copyes el gemelo de Add: misma posición, sin valor de retorno - La sorpresa que rompe casi todas las macros — un
Copya secas genera un libro nuevo - Cómo referenciar la copia cuando el método no devuelve nada
- Qué viaja con una hoja copiada — fórmulas, formato, código y nombres definidos
- Cómo
Moverefleja aCopycon la intención opuesta, y cómo copiar a otro libro
El modelo mental: Copy es el gemelo de Add, sin valor de retorno
Añadir y copiar una hoja comparten gramática. Ambos aceptan Before:= y After:= para decir dónde
cae la hoja, y ambos toman por defecto una posición en vez del final. La diferencia es que Add es
una función que te entrega la hoja nueva, mientras que Copy es un método que no devuelve
absolutamente nada. No puedes escribir Set ws = src.Copy; es un error de compilación.
Así que Excel te deja exactamente una forma de agarrar el duplicado recién hecho: justo después de que
Copy se ejecuta, la copia se convierte en la hoja activa. Captúrala en la línea siguiente, antes
de que cualquier otra cosa pueda robar el foco:
src.Copy After:=Worksheets(Worksheets.Count)
Dim copy As Worksheet
Set copy = ActiveSheet ' esta ES la copia - agarrala ahora
Este es uno de los raros sitios donde fiarse de ActiveSheet es correcto y no una chapuza, porque
Copy de verdad deja activa la hoja nueva y no hay mejor asa. La disciplina es hacerlo de
inmediato: un Calculate, un DoEvents o un controlador de eventos entre Copy y
Set copy = ActiveSheet puede mover el foco y entregarte la hoja equivocada.
La sorpresa que rompe casi todas las macros: un Copy a secas genera un libro nuevo
Este es el comportamiento que manda a la gente a los buscadores. Sería razonable esperar que
Sheets("Template").Copy —sin argumentos— duplicara la hoja dentro del libro actual. No lo hace. Un
Copy sin Before ni After crea un libro nuevo de una sola hoja y pone ahí la copia. Ejecútalo
en un bucle y obtienes un montón de ventanas nuevas en vez de un montón de pestañas nuevas.
src.Copy ' NO es un duplicado local - aparece un libro nuevo entero
La regla es sencilla: pasa siempre un destino cuando quieres un duplicado dentro del libro. La forma sin argumentos no es un fallo, eso sí: es el modismo más limpio de todo VBA para exportar una hoja como su propio archivo:
src.Copy ' libro nuevo con solo esta hoja
ActiveWorkbook.SaveAs "C:\Reports\September.xlsx", FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False
Así que el mismo método sirve a dos intenciones según un solo argumento. Decide cuál quieres, y nunca
dejes que un After que falta convierta un «duplicar esta pestaña» en un «abrir cuarenta libros».
Qué viaja con una hoja copiada
Copy clona el objeto, no solo los valores, y eso es más de lo que la mayoría se imagina. Una hoja
copiada trae consigo sus fórmulas, su formato, sus gráficos, sus formas, su formato condicional, el
código de su módulo de hoja y cualquier nombre definido con ámbito de hoja. De ahí se siguen dos
consecuencias:
- Las fórmulas que referenciaban otras hojas conservan esas referencias, así que una copia dentro del mismo libro puede terminar apuntando en silencio a las vecinas del original: comprueba si querías que los enlaces apuntaran a otro sitio.
- Los nombres definidos duplicados son el efecto secundario clásico: copia una hoja con un nombre de ámbito acotado y Excel puede preguntarte por un nombre que ya existe, o crear en silencio un segundo con un ámbito distinto.
Si solo quieres los datos, no copies la hoja: copia el rango. dst.Range("A1:Z100").Value = src.Range("A1:Z100").Value mueve los valores sin nada de ese equipaje. Copiar la hoja entera es la
herramienta adecuada cuando quieres deliberadamente reproducir la plantilla intacta —disposición,
fórmulas y código—.
Nombrar la copia, y cómo Move refleja a Copy
Excel nombra automáticamente un duplicado como Template (2), Template (3), y así, de modo que casi
siempre lo renombras al instante. Como no hay valor de retorno, renombra a través de la hoja activa en
la línea justo después de Copy, y se aplican las mismas reglas del artículo de
Add: 31 caracteres, único, sin : \ / ? * [ ].
Worksheet.Move es la imagen especular de Copy. Toma los argumentos Before:=/After:=
idénticos, pero reubica la hoja en vez de duplicarla, y un Move a secas sin destino también
abre un libro nuevo, sacando la hoja por completo del actual. Misma forma de argumentos, intención
opuesta:
src.Move After:=Worksheets(Worksheets.Count) ' reubica al final (sin duplicar)
src.Copy To:=Workbooks("Report.xlsx").Worksheets(1) ' copia DENTRO de otro libro abierto
Para copiar dentro de otro libro, apunta a su hoja en el argumento Before/After: los dos archivos
deben estar abiertos. El criterio para todo el método: pasa siempre un destino, captura la copia a
través de ActiveSheet en la línea siguiente, recuerda que la copia lleva código y nombres consigo, y
recurre a la forma a secas solo cuando «libro nuevo» sea el objetivo real.
Cómo te ayuda ExcelMaster
Copiar una hoja esconde una mina —la forma sin argumentos abre un libro nuevo en vez de duplicar— y dos trampas más silenciosas: no hay valor de retorno que agarrar, y una copia que se arrastra consigo su código y sus nombres definidos.
ExcelMaster te deja decir la
intención con claridad —«duplica la hoja Template al final y ponle el nombre de hoy» o «exporta esta
hoja como su propio archivo»— y escribe la forma correcta para cada caso: un Copy posicionado con
una captura de ActiveSheet y un renombrado para el duplicado dentro del libro, o un Copy a secas
más un SaveAs para la exportación. También avisa cuando una hoja copiada lleva fórmulas o nombres
que van a chocar. Tú conservas el libro y el código.
Preguntas frecuentes
¿Cómo copio una hoja de cálculo en VBA?
Usa Worksheet.Copy con un destino: src.Copy After:=Worksheets(Worksheets.Count) duplica la hoja al
final. Como Copy no devuelve nada, agarra la hoja nueva a través de ActiveSheet en la línea
siguiente —Set copy = ActiveSheet— y luego renómbrala. Pasa siempre Before:= o After:=; la forma
sin argumentos hace algo distinto.
¿Por qué mi macro de Copy abre un libro nuevo?
Porque llamaste a Copy sin argumento Before ni After. Un Worksheet.Copy a secas no duplica
dentro del libro actual, sino que crea un libro nuevo de una sola hoja que contiene la copia. Pasa un
destino (After:=Worksheets(Worksheets.Count)) para duplicar en el sitio, y reserva la forma sin
argumentos para exportar una hoja como su propio archivo.
¿Cómo obtengo una referencia a la hoja copiada?
Copy no tiene valor de retorno, así que no puedes escribir Set ws = src.Copy. En su lugar, la copia
se convierte en la hoja activa justo después de la llamada, así que captúrala con
Set copy = ActiveSheet en la línea inmediatamente siguiente, antes de que ningún Calculate,
DoEvents o controlador de eventos pueda mover el foco y entregarte la hoja equivocada.
¿Cómo copio una hoja a otro libro?
Apunta a una hoja del otro libro dentro del argumento de posición, con los dos archivos abiertos:
src.Copy After:=Workbooks("Report.xlsx").Worksheets(Worksheets.Count). La copia lleva consigo sus
fórmulas, su formato y su código; vigila las fórmulas que referenciaban el libro de origen, porque
pueden terminar apuntando al archivo original.
¿Cuál es la diferencia entre Copy y Move?
Worksheet.Copy duplica la hoja; Worksheet.Move la reubica, quitándola de su posición original.
Ambos toman los mismos argumentos Before:=/After:=, y ambos abren un libro nuevo cuando se llaman
sin destino. Usa Copy para estampar un duplicado y Move para reordenar o extraer una hoja.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 14/09/2026.
Guías relacionadas: VBA Add Sheet · VBA Delete Sheet · VBA Worksheets · VBA Open Workbook · VBA ThisWorkbook
