🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Copy Sheet en Excel — duplica una hoja sin generar un libro nuevo

|

VBA Copy Sheet en Excel — duplica una hoja sin generar un libro nuevo

TL;DRWorksheet.Copy usa la misma posición con Before:=/After:= que usas para Add, pero con dos diferencias que pillan a todo el mundo. Primera: no devuelve nada —no existe Set ws = sheet.Copy—, así que agarras la copia recién hecha a través de ActiveSheet en la línea siguiente. Segunda, y esta es la gorda: ws.Copy sin destino no copia dentro del libro, sino que crea un libro completamente nuevo que contiene la copia. Pasa siempre un Before o un After salvo 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 — Copy es el gemelo de Add: misma posición, sin valor de retorno
  • La sorpresa que rompe casi todas las macros — un Copy a 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 Move refleja a Copy con 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