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

VBA Renombrar Archivo en Excel — la instrucción Name que también mueve archivos (y se niega a sobrescribir)

|

VBA Renombrar Archivo en Excel — la instrucción Name que también mueve archivos (y se niega a sobrescribir)

TL;DRName oldPath As newPath renombra un archivo — pero si newPath apunta a una carpeta distinta, VBA mueve el archivo allí. Una sola instrucción hace ambos trabajos. Y a diferencia de FileCopy, Name se niega a sobrescribir: si el destino ya existe lanza error 58 en lugar de reemplazarlo.

Sub RenameAndMove()
    Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx"    ' misma carpeta -> un renombrado
    Name "C:\Reports\final.xlsx" As "C:\Archive\final.xlsx"    ' carpeta distinta -> un MOVIMIENTO
End Sub

Renombrar y mover parecen dos operaciones distintas, así que la mayoría de la gente va buscando dos comandos distintos. VBA los pliega en una sola instrucción — Name — y la sorpresa no es que renombre, sino que la misma instrucción mueve el archivo en silencio en cuanto la carpeta de destino difiere. Añade su terco rechazo a sobrescribir, y Name se comporta a diferencia de cualquier otra herramienta de disco en VBA. Aprende esos dos rasgos y se vuelve predecible.

Lo que aprenderás

  • El modelo mental — Name es renombrar y mover en una sola instrucción
  • Por qué Name se niega a sobrescribir con error 58 — lo contrario de FileCopy
  • Por qué Name no puede cruzar unidades, y cómo FileCopy + Kill o MoveFile hace ese trabajo
  • Los otros errores — origen que falta (53), archivo abierto (70) — y cómo protegerte de ellos
  • La trampa de sintaxis Name old As new, y por qué se lee raro junto a la propiedad .Name
  • Cuándo preferir FileSystemObject.MoveFile, y el patrón de renombrado seguro para macros desatendidas

El modelo mental: renombrar y mover son la misma instrucción

La idea clave es que a Name no le importa el concepto de renombrar frente a mover — solo le importan la ruta antigua y la ruta nueva. Elimina la entrada de directorio en la ruta antigua y crea una en la ruta nueva. Si la parte de la carpeta es la misma, eso se te lee como un renombrado. Si la parte de la carpeta difiere, el archivo acaba en otro sitio — un movimiento:

  • Name "C:\In\a.xlsx" As "C:\In\b.xlsx" — misma carpeta, nombre nuevo → renombrado
  • Name "C:\In\a.xlsx" As "C:\Out\a.xlsx" — carpeta nueva, mismo nombre → movimiento
  • Name "C:\In\a.xlsx" As "C:\Out\b.xlsx" — carpeta nueva y nombre nuevo → movimiento y renombrado a la vez

No hay una instrucción «mover» separada en el VBA built-in — Name es el movimiento. Una vez que lo ves como «cambiar la ruta», cada comportamiento de abajo se deduce.

Name se niega a sobrescribir — lo contrario de FileCopy

Aquí es donde Name se separa del resto del kit de herramientas del disco. Si ya existe un archivo en la ruta nueva, Name no lo reemplazará — se detiene con un error:

Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx"    ' error 58 - "File already exists"

Compara los tres built-ins y sus respuestas contradictorias a «¿qué pasa si el destino existe?»:

  • Kill — borra sin ningún aviso (el destino es el objetivo).
  • FileCopysobrescribe el destino en silencio.
  • Namese niega y lanza error 58.

Esto es una característica de seguridad: Name nunca aplastará un archivo existente por accidente. Pero también significa que una macro desatendida se detiene en el instante en que el nombre de destino ya está ocupado. Si tu intención es reemplazar el destino, bórralo primero — y protege eso con una comprobación de existencia:

If Dir("C:\Reports\final.xlsx") <> "" Then Kill "C:\Reports\final.xlsx"   ' limpia el destino
Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx"                    ' ahora tiene exito

Ese test de existencia es de nuevo el one-liner de comprobar-si-un-archivo-existe; aquí es lo que evita que un renombrado programado se detenga en error 58.

Name no puede cruzar unidades — usa FileCopy + Kill o MoveFile

Name mueve archivos dentro de una unidad reescribiendo una entrada de directorio, lo cual es rápido y barato. No puede mover un archivo a una unidad distinta, porque eso requiere copiar físicamente los bytes:

Name "C:\Reports\March.xlsx" As "D:\Archive\March.xlsx"    ' error 74 - "Can't rename with different drive"

Un movimiento entre unidades es una copia más un borrado — exactamente la identidad de la guía de copiar archivos:

FileCopy "C:\Reports\March.xlsx", "D:\Archive\March.xlsx"  ' copia los bytes a la otra unidad
Kill "C:\Reports\March.xlsx"                                ' luego elimina el original

Haz el Kill solo después de confirmar que la copia aterrizó — ese borrado es permanente. O deja que el FileSystemObject haga ambos en una sola llamada con MoveFile, que maneja los movimientos entre unidades internamente (se trata más abajo).

Los otros errores: origen que falta y archivos abiertos

Dos errores más en tiempo de ejecución redondean Name, y ambos tienen los mismos arreglos que el resto de las instrucciones de archivo:

Name "C:\Reports\missing.xlsx" As "C:\Reports\x.xlsx"   ' error 53 - origen no encontrado
Name "C:\Reports\open.xlsx"    As "C:\Reports\x.xlsx"   ' error 70 - el archivo esta abierto/bloqueado
  • error 53 — el origen no existe. Protégete con If Dir(oldPath) <> "" Then antes de renombrar.
  • error 70 — el archivo (o su destino) está abierto. No puedes renombrar un libro que está abierto en Excel; Close primero, luego renombra el archivo en disco.

Así que un renombrado robusto protege tres cosas: el origen existe, el destino no existe (o acaba de borrarse), y el archivo no está abierto. Eso es más cuidado del que un renombrado parece necesitar, pero es exactamente lo que evita que una macro desatendida se atasque en un error en tiempo de ejecución sin diálogo.

La trampa de sintaxis: Name old As new, no Name(old, new)

Name es una instrucción, no una función, y su sintaxis es inusual — las dos rutas se unen con la palabra clave As, sin paréntesis y sin coma:

Name oldPath As newPath      ' correcto - forma de instruccion con la palabra clave As
Name(oldPath, newPath)       ' incorrecto - Name no funciona asi; error de compilacion/analisis

También se lee de forma confusa porque VBA ya usa .Name como una propiedad por todo el modelo de objetos (ws.Name, wb.Name). El Name que renombra archivos es una instrucción de nivel superior, sin relación con esas propiedades; ver Name x As y en su propia línea es la señal de que es la operación de archivo, no una lectura de propiedad.

FileSystemObject.MoveFile y el patrón de renombrado seguro

La alternativa del modelo de objetos es MoveFile, y suele ser la mejor opción para los movimientos:

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")     ' enlace tardio - corre en cualquier maquina
fso.MoveFile "C:\Reports\March.xlsx", "D:\Archive\"      ' maneja el cruce de unidades; \ final = dentro de la carpeta

MoveFile mueve entre unidades sin un copiar-y-luego-borrar manual, acepta comodines, y toma un destino de estilo carpeta (\ final). Como Name, se niega a sobrescribir — así que el destino debe estar despejado primero. Para un renombrado en el sitio puro, no hay ningún método FSO dedicado; Name sigue siendo la herramienta más corta, o MoveFile con una ruta nueva completa en la misma carpeta.

Juntándolo todo, el renombrado seguro que no atascará una macro desatendida:

Dim src As String, dst As String
src = "C:\Reports\draft.xlsx": dst = "C:\Reports\final.xlsx"
If Dir(src) = "" Then Exit Sub               ' nada que renombrar
If Dir(dst) <> "" Then Kill dst              ' limpia el destino para que Name no choque con el error 58
Name src As dst                              ' renombrado o movimiento en la misma unidad

El veredicto honesto: Name para la misma unidad, copiar-más-borrar para entre unidades

Name es la respuesta de una línea para renombrar y para mover dentro de una unidad — siempre que respetes sus dos rasgos definitorios. Cuatro reglas:

  • Renombrado o movimiento en la misma unidadName old As new — todo el trabajo en una sola instrucción.
  • Se niega a sobrescribir → despeja el destino primero (Kill tras una comprobación de existencia), o se detiene en error 58.
  • Movimiento entre unidadesName no puede; usa FileCopy + Kill, o fso.MoveFile.
  • Protege el origen, el destino y el estado de apertura → para que un renombrado programado nunca se atasque en error 53, 58, 70 o 74.

En el momento en que ves error 74, deja de intentar hacer que Name cruce la unidad — eso es Windows diciéndote que un movimiento entre volúmenes es una copia, y la herramienta cambia en consecuencia.

Cómo ayuda ExcelMaster

Renombrar un archivo de forma segura significa acordarse de que Name también mueve, de que se niega a sobrescribir, de que no puede cruzar unidades, y de que se atasca en un origen que falta o en un archivo abierto — cuatro trampas separadas alrededor de una instrucción que parece que debería solo renombrar.

ExcelMaster escribe el renombrado que no se atascará. Describe el trabajo — «renombra cada exportación con la fecha de hoy» o «mueve los archivos terminados a la unidad de archivo histórico» — y produce la instrucción correcta: Name para un renombrado o movimiento en la misma unidad con la protección de despejar el destino, un FileCopy- más-Kill o fso.MoveFile cuando el destino está en otra unidad, y comprobaciones de existencia para que error 58 o 74 nunca detengan una ejecución desatendida. Tú describes el resultado; él elige entre renombrar, mover y copiar-más-borrar por ti.

Preguntas frecuentes

¿Cómo renombro un archivo en VBA?

Usa la instrucción Name con la palabra clave As: Name "C:\In\old.xlsx" As "C:\In\new.xlsx". Renombra el archivo en su sitio cuando ambas rutas están en la misma carpeta. Protégelo primero — Name lanza error 53 si el origen falta y error 58 si ya existe un archivo con el nombre nuevo, así que comprueba que el origen existe y despeja el destino (con Kill tras un test de existencia) antes de renombrar.

¿La instrucción Name de VBA mueve archivos también?

Sí. Name cambia la ruta del archivo, así que si la ruta nueva está en una carpeta distinta, VBA mueve el archivo allí — Name "C:\In\a.xlsx" As "C:\Out\a.xlsx" mueve a.xlsx de In a Out. No hay ninguna instrucción de movimiento separada en el VBA built-in; Name es el movimiento, siempre que ambas carpetas estén en la misma unidad. Para un movimiento entre unidades, usa FileCopy más Kill, o fso.MoveFile.

¿Por qué VBA Name da error 58 File already exists?

Porque ya existe un archivo con el nombre nuevo, y Name se niega a sobrescribir — lo contrario de FileCopy, que sobrescribe en silencio. Esto es una característica de seguridad, pero detiene una macro desatendida. Para reemplazar el destino, bórralo primero: If Dir(newPath) <> "" Then Kill newPath, luego Name oldPath As newPath. Confirma siempre que de verdad tienes la intención de descartar el archivo existente antes de hacerle Kill.

¿Cómo muevo un archivo a otra unidad en VBA?

Name no puede cruzar unidades — Name "C:\a.xlsx" As "D:\a.xlsx" lanza error 74, «Can't rename with different drive». Un movimiento entre unidades es una copia más un borrado: FileCopy "C:\a.xlsx", "D:\a.xlsx" luego Kill "C:\a.xlsx" (solo después de confirmar que la copia tuvo éxito). Como alternativa, fso.MoveFile del FileSystemObject realiza un movimiento entre unidades en una sola llamada.

¿Cuál es la diferencia entre la instrucción Name y la propiedad Name?

No tienen relación. La instrucción Name renombra o mueve un archivo en disco — Name oldPath As newPath, una instrucción de nivel superior que usa la palabra clave As. La propiedad .Name lee o establece el nombre de un objeto en el modelo de Excel, como ws.Name para una hoja o wb.Name para un libro. Ver Name x As y en su propia línea es la operación de archivo; something.Name es la propiedad.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 22/08/2026.

Guías relacionadas: VBA Copy File · VBA Delete File · VBA Check If File Exists · VBA Dir · VBA FileSystemObject