TL;DR —
FileCopy source, destinationcopia un archivo en una sola línea, no necesita referencias, y sobrescribe en silencio lo que ya esté en el destino. La trampa con la que todo el mundo tropieza: no puede copiar un archivo que está abierto — incluido el libro desde el que estás ejecutando la macro. Ambas rutas deben ser completas, con nombre de archivo y todo, y la carpeta de destino debe existir ya:
Sub BackupReport()
' Ambos argumentos son rutas COMPLETAS, incluido el nombre del archivo en cada lado
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx" ' sobrescribe Backup en silencio
End Sub
Una vez que una macro ha encontrado los archivos sobre los que tiene que trabajar, lo siguiente que suele
hacer es actuar sobre ellos — y la más suave de esas acciones es copiar uno a un sitio seguro antes de que
nada más lo toque. Ahí es también donde los principiantes chocan con su primer muro: FileCopy funciona a la
perfección sobre un archivo cerrado y luego falla con error 70 en cuanto lo apuntas a un libro que está
abierto. Entiende por qué, y siempre echarás mano de la correcta de las tres herramientas de copia.
Lo que aprenderás
- El modelo mental — cuál herramienta de copia necesitas depende de si el archivo está abierto
- Por qué
FileCopysobrescribe sin avisar — lo contrario de la instrucciónName - Por qué
FileCopyfalla con error 70 en un libro abierto, y qué usar en su lugar - Por qué ambos argumentos deben ser rutas completas y la carpeta de destino debe existir ya
- Cuándo cambiar a
FileSystemObject.CopyFilepara comodines y un flag de sobrescritura explícito - Cómo copiar el libro abierto ahora mismo con
SaveCopyAs, y cómo copiar-y-luego-Killse convierte en un movimiento
El modelo mental: tres herramientas de copia para tres situaciones
No hay un único comando de «copiar un archivo» en VBA — hay tres, y no son intercambiables. La pregunta que elige el correcto es siempre la misma: ¿está el archivo abierto, y necesitas comodines?
FileCopy source, destination— la instrucción built-in. Sin referencias, sin objetos. Copia un archivo cerrado, sobrescribe el destino en silencio. Este es tu valor por defecto para archivos que reposan en disco.FileSystemObject.CopyFile source, destination[, overwrite]— la versión del modelo de objetos. El mismo trabajo, pero acepta comodines (*.xlsx), toma un flag de sobrescritura explícito, y tiene un hermanoCopyFolderpara árboles enteros.workbook.SaveCopyAs path— la única forma correcta de copiar un libro que está abierto ahora mismo. Escribe una instantánea en disco sin perturbar el archivo vivo.
Todo lo de abajo es una consecuencia de estos tres y de las situaciones a las que pertenecen. Elige preguntando primero «¿está abierto?», y segundo «¿necesito un patrón?».
FileCopy sobrescribe en silencio — lo contrario de Name
FileCopy nunca pregunta. Si ya existe algo en el destino, se reemplaza sin ningún aviso y sin ningún
error. Esto importa porque la instrucción hermana para el disco, Name, hace
exactamente lo contrario — se niega a sobrescribir y lanza un error. Dos built-ins, dos respuestas
contradictorias a «¿qué pasa si el destino existe?»:
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx" ' reemplaza Backup\March.xlsx, sin aviso
Si un sobrescribir en silencio es lo que quieres (refrescar una copia de seguridad), es cómodo. Si no lo es —
si esa copia de seguridad era la única copia de ayer — debes proteger el destino tú mismo antes de llamar a
FileCopy:
If Dir("C:\Backup\March.xlsx") = "" Then ' solo copia si no hay nada ahi
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"
End If
Ese test de existencia de una línea es el tema de comprobar si un archivo existe; aquí es la diferencia entre una copia de seguridad a salvo y una destruida.
La trampa del error 70: FileCopy no puede copiar un archivo abierto
Este es el bug número uno de FileCopy. La instrucción pide a Windows acceso de lectura exclusivo sobre el
origen y acceso de escritura exclusivo sobre el destino. Un libro abierto está bloqueado por Excel, así que:
FileCopy ThisWorkbook.FullName, "C:\Backup\live.xlsx" ' error 70 - "Permission denied"
falla de inmediato — y el archivo que más quieres respaldar (aquel en el que estás trabajando) es
exactamente el que está abierto. El mismo error 70 aparece si el destino está abierto, o es de solo
lectura, o no tienes permisos sobre la carpeta. Hay dos salidas correctas:
- Si es tu libro, usa
SaveCopyAs— copia el archivo vivo sin cerrarlo (siguiente sección). - Si es otro libro que abriste en código, haz
Closeprimero, luegoFileCopydel archivo en disco.
Nunca «arregles» el error 70 con On Error Resume Next — eso esconde un archivo bloqueado como una no-copia
silenciosa, y tu copia de seguridad sencillamente nunca ocurre.
Ambos argumentos son rutas completas — y la carpeta debe existir
Dos reglas estructurales pillan a la gente una y otra vez:
El destino es una ruta completa, no una carpeta. FileCopy no infiere el nombre del archivo a partir del
origen.
FileCopy "C:\Reports\March.xlsx", "C:\Backup\" ' error 75 - error de acceso a ruta/archivo
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx" ' correcto - nombralo explicitamente
La carpeta de destino debe existir ya. FileCopy no creará C:\Backup\ por ti. Si la carpeta pudiera
faltar, créala primero con MkDir — y recuerda que MkDir en sí mismo da error si la carpeta ya existe, así
que protégelo:
If Dir("C:\Backup", vbDirectory) = "" Then MkDir "C:\Backup"
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"
FileSystemObject.CopyFile: comodines y un flag de sobrescritura explícito
Cuando necesitas copiar muchos archivos a la vez, o quieres que sobrescribir sea una decisión en lugar de
un valor por defecto silencioso, cambia al FileSystemObject:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' enlace tardio - corre en cualquier maquina
fso.CopyFile "C:\Reports\*.xlsx", "C:\Backup\" ' comodines: cada .xlsx de una vez
fso.CopyFile "C:\Reports\March.xlsx", "C:\Backup\March.xlsx", False ' Overwrite:=False -> error si ya existe
Tres cosas que FileCopy no puede hacer y CopyFile sí: coincidir con un patrón comodín, tomar un
flag de sobrescritura para que un archivo existente lance el error 58 en lugar de desaparecer en
silencio, y — con CopyFolder — copiar un árbol de directorios entero. Fíjate en que aquí se permite la forma
de solo-carpeta como destino (una \ final significa «dentro de esta carpeta»), que es la razón por la que
CopyFile combina de forma natural con un origen comodín. Aun así, sigue sin poder copiar un archivo
abierto — esa limitación pertenece a Windows, no a la herramienta.
Copia el libro abierto con SaveCopyAs — y copiar-y-luego-Kill es un movimiento
Para el libro vivo, la respuesta no es una copia de sistema de archivos en absoluto — es un método del libro:
ThisWorkbook.SaveCopyAs "C:\Backup\March-" & Format(Now, "yyyymmdd-hhnnss") & ".xlsx"
SaveCopyAs escribe una copia en disco y deja el original abierto e intacto — sin error 70, sin cerrar,
sin cambiar la propia ruta del libro. Es la llamada de copia de seguridad correcta dentro de cualquier macro
larga, y se trata junto a Save y SaveAs en la guía de guardar libros.
Por último, una identidad útil: un movimiento es una copia seguida de un borrado. Cuando no puedes usar
Name — por ejemplo al mover un archivo a una unidad distinta, cosa que
Name rechaza — recurres a copiar-y-luego-borrar:
FileCopy "C:\Reports\March.xlsx", "D:\Archive\March.xlsx" ' copia a la otra unidad
Kill "C:\Reports\March.xlsx" ' luego elimina el original
Ese Kill es permanente y no tiene deshacer, así que hazlo solo después de
haber confirmado que la copia aterrizó.
El veredicto honesto: elige por «¿está abierto?» y luego «¿necesito un patrón?»
Copiar un archivo es trivial hasta que el archivo está abierto o el destino ya importa. Cuatro reglas lo mantienen correcto:
- Archivo cerrado, una sola copia →
FileCopy— el más corto, sin preparación, pero sobrescribe en silencio, así que protege el destino cuando el archivo existente importa. - Muchos archivos o una decisión real de sobrescritura →
fso.CopyFilecon un comodín y el flagOverwrite. - El libro abierto →
SaveCopyAs, nuncaFileCopy— esa es la respuesta entera alerror 70. - Rutas completas, carpeta existente → nombra el archivo de destino explícitamente y haz
MkDirde la carpeta primero.
En el instante en que FileCopy te da error 70, deja de echar mano de On Error y hazte la pregunta de
verdad: ¿está este archivo abierto? Si es tuyo, SaveCopyAs; si es otro, ciérralo primero.
Cómo ayuda ExcelMaster
Elegir entre FileCopy, fso.CopyFile y SaveCopyAs — y acordarse de que solo el último puede tocar un
libro abierto, de que el destino necesita una ruta completa, y de que la carpeta debe existir primero — es
mucha ceremonia para «solo haz una copia», y la elección equivocada falla con un críptico error 70 en tiempo
de ejecución.
ExcelMaster escribe la copia correcta
para la situación. Describe el trabajo — «respalda este libro con una marca de tiempo antes de que sobrescriba
nada» o «copia cada .xlsx de esta carpeta a un archivo histórico» — y produce la llamada correcta:
SaveCopyAs para el archivo vivo, fso.CopyFile con un comodín para un lote, la protección con MkDir para
una carpeta que falta, y un copiar-y-luego-Kill cuando de verdad querías un
movimiento entre unidades. Tú describes el resultado; él elige la herramienta que no lanzará el error 70.
Preguntas frecuentes
¿Cómo copio un archivo en VBA?
Usa el built-in FileCopy source, destination, donde ambos argumentos son rutas completas que incluyen el
nombre del archivo — por ejemplo FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx". No necesita
referencias y copia un archivo cerrado, pero sobrescribe el destino en silencio y la carpeta de destino
debe existir ya. Para copiar muchos archivos a la vez, usa FileSystemObject.CopyFile con un origen comodín.
¿Por qué VBA FileCopy da error 70 Permission denied?
Porque el archivo de origen o de destino está abierto o bloqueado. FileCopy necesita acceso exclusivo, y
Excel bloquea cualquier libro abierto — así que copiar el libro desde el que estás ejecutando siempre falla con
error 70. Para copiar el libro abierto ahora mismo, usa ThisWorkbook.SaveCopyAs path en su lugar; para
copiar otro libro que abriste en código, haz Close primero, luego FileCopy del archivo en disco.
¿Cómo copio un archivo a otra carpeta en VBA?
Dale a FileCopy un destino en esa carpeta, como una ruta completa con el nombre del archivo:
FileCopy "C:\In\a.xlsx", "C:\Out\a.xlsx". La carpeta de destino debe existir ya — FileCopy no la creará,
así que protégete con If Dir("C:\Out", vbDirectory) = "" Then MkDir "C:\Out" primero. Para un destino de solo
carpeta como "C:\Out\", usa fso.CopyFile en lugar de FileCopy.
¿VBA FileCopy sobrescribe un archivo existente?
Sí — en silencio, sin ningún aviso y sin ningún error. Esto es lo contrario de la instrucción
Name, que se niega a sobrescribir. Si no quieres reemplazar un archivo existente,
compruébalo primero con Dir(path) = "" o fso.FileExists(path), o usa
fso.CopyFile source, destination, False para que un destino existente lance el error 58 en lugar de
desaparecer.
¿Cómo copio el libro abierto actual en VBA?
Usa ThisWorkbook.SaveCopyAs "C:\Backup\copy.xlsx". SaveCopyAs escribe una instantánea en disco mientras
deja el original abierto y sin cambios, así que evita el error 70 que obtienes de FileCopy sobre un archivo
abierto. Es la forma estándar de tomar una copia de seguridad con marca de tiempo dentro de una macro larga, y
no altera la propia ruta guardada del libro.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 22/08/2026.
Guías relacionadas: VBA Delete File · VBA Rename File · VBA Dir · VBA FileSystemObject · VBA Save Workbook
