lunes, 6 de octubre de 2014

VBA: Cambiar nombres de ficheros con la instrucción NAME.

La idea de hoy es cambiar el nombre de un fichero empleando una sencilla macro, basada en la instrucción poco conocida Name.
Deberemos saber que esta instrucción Name nos permite cambiar el nombre de un archivo y moverlo a un directorio o carpeta diferente (si así lo deseamos).
Tendremos cuidado, ya que Name puede mover un archivo a través de unidades pero sólo puede cambiar el nombre a un directorio o carpeta existente cuando tanto 'el nombre de la ruta antigua' como 'el nombre de la ruta nueva' están ubicados en la misma unidad.
Importante: Name no puede crear un nuevo archivo, directorio o carpeta!!!.

Por último, un par de limitaciones más...
si utilizamos la instrucción Name con un archivo abierto se producirá un error.
Los argumentos de la instrucción Name no pueden incluir caracteres comodín múltiples (*) ni sencillos (?).

La gran ventaja de esta instrucción es que con ésta podemos cambiar nombres de archivos sin abrirlos (como requeriría, por ejemplo, el método Workbook.SaveAs)


Conocidas entonces las ventajas e inconvenientes podemos trabajar con ella

La idea del ejercicio de hoy es renombrar los ficheros contenidos en una carpeta/directorio ('E:\excelforo\Cambios'):

VBA: Cambiar nombres de ficheros con la instrucción NAME.


Tenemos en la Hoja1 de nuestro fichero 'base' (un tercer fichero independiente), donde hemos incluido nuestra macro, la correspondencia entre los viejos y nuevos nombres:

VBA: Cambiar nombres de ficheros con la instrucción NAME.



Con esta hipótesis de trabajo, podemos disponer de nuestro procedimiento, dentro del proyecto de VBA de nuestro Libro de trabajo, dentro del Editor de VB, en un módulo, insertamos el siguiente código:

Sub CambiarNombres()
Dim NombreViejo As String
Dim NombreNuevo As String

'recorremos las celdas A2:A5 con los viejos nombres
For Each fichero In Range("A2:A5")
    'asignamos valores a las variables, con el viejo y nuevo nombre
    NombreViejo = "E:\excelforo\Cambios\" & fichero.Value & ".xlsx"
    NombreNuevo = "E:\excelforo\Cambios\" & fichero.Offset(0, 1).Value & ".xlsx"
    'con la instrucción Name procedemos al cambio de nombre de un archivo, directorio o carpeta.
    Name NombreViejo As NombreNuevo
Next fichero
End Sub



Tras ejecutarlo, conseguimos nuestro objetivo...

VBA: Cambiar nombres de ficheros con la instrucción NAME.


Los nombres de los ficheros han sido reemplazados por los nuevos.

20 comentarios:

  1. Muchas gracias, funciona muy bien y nos resuelve un problema importante.
    Saludos
    Miguel

    ResponderEliminar
  2. Hola muchas gracias, a ver si me puedes ayudar,tengo un problema, varios nombres nuevos que son iguales, necesito añadir una excepción cuando encuentre un nombre nuevo añada un 1, el siguiente un 2...gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      habría que añadir un control que verifique si existe o no el nombre de la hoja previamente... en caso afirmativo añadir un autonumérico...
      prueba con On Error GoTo o algún otro check...
      Saludos

      Eliminar
  3. Saludos, si alguien me puede ayudar " Tenemos en la Hoja1 de nuestro fichero 'base' (un tercer fichero independiente), donde hemos incluido nuestra macro, la correspondencia entre los viejos y nuevos nombres:" no entiendo. Que ahy que poner y donde.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Andreu,
      la lista de equivalencias entre los nombres viejos y los nuevos nombres de los ficheros debe estar en un fichero desde la cual ejecutaremos la macro descrita...
      Desde aquí se gestiona el renombre de archivos.

      Saludos

      Eliminar
  4. Respuestas
    1. Hola Angie,
      la macro la tienes especificada en el post...

      Saludos

      Eliminar
  5. Como puedo hacer para que en una tercer columna me ponga un texto indicando que se cambiaron correctamente los archivos?

    ResponderEliminar
    Respuestas
    1. Hola Aslan
      qué tal estás?, un placer saludarte igualmente.
      Puedes añadir entre la fila 11 y 12 del código:
      cells(fichero.row,"C").value="Cambiado"

      Un cordial saludo

      Eliminar
  6. Hola, a mi me sale error 53 que hago ?

    ResponderEliminar
    Respuestas
    1. Hola,
      asegúrate que la ruta termina en \, por ejemplo:
      A:\excelforo\
      y luego la celda con el nombre del fichero

      Saludos

      Eliminar
  7. me pone un error dice: se ah producido el error 75¨ en tiempo de ejecución necesito ayuda esqe no se si lo este asiendo mal lo estoi asiendo en 4 columnas a,b,c y d tal como esta pagina dice pero no me deja me podrias ayudar
    http://blogs.itpro.es/exceleinfo/2012/10/03/cambiar-nombre-de-archivos-desde-excel-con-macros/

    ResponderEliminar
    Respuestas
    1. Hola David,
      no tengo ninguna relación con esa página...
      Sigue las indicaciones del post más arriba, está probado y garantizado.
      Un saludo

      Eliminar
  8. Lo teneis actualizado para version Excel 2013 o superior?. Solo me funciona en versiones de 2007 o inferior. Gracias

    ResponderEliminar
    Respuestas
    1. Hola, que tal estás?.
      El procedimiento funciona (probado) con Excel 2016..
      No he probado con 2013, pero creo recordar que se publicó con Excel 2010...

      Revisa que los nombres de los ficheros sean iguales a como se llaman en realidad.

      Saludos

      Eliminar
    2. Gracias Ismael, pero yo lo uso en MAC y me da error de carga de Modulos...y nose solucionarlo...

      Eliminar
    3. Hola,
      el problema es que el SO y por tanto algunos aspectos de la programación en VBA son distintas en MAC...
      Deberías preguntar a algún experto en MAC, lo siento pero yo solo me muevo en entorno Windows.
      Un saludo y suerte

      Eliminar
  9. buenas tardes alguien me puede ayudar con lo siguiente, y es que el cambio de ficheros funciona perfecto, pero si el archivo existe si no existe me genera un mensaje donde dice que archivo no existe, lo que trato de hacer es que si el archivo existe lo cambie si no no haga nada.
    Sub CambiarNombres()
    Dim NombreViejo As String
    Dim NombreViejo1 As String
    Dim NombreNuevo As String
    Dim NombreNuevo1 As String
    Dim NombreRuta As String
    ruta = "C:\Aloha\pedidos\"
    nombre = Format(Now, "ddmmyyyy")
    extencion = ".pdf"
    NombreRuta = ruta & nombre & extencion
    If My.Computer.FileSystem.File.Exists(NombreRuta) Then
    For Each fichero In Range("A2:A2")
    NombreViejo = "C:\Aloha\pedidos\" & fichero.Value & ".xlsx"
    NombreViejo1 = "C:\Aloha\pedidos\" & fichero.Value & ".pdf"
    NombreNuevo = "C:\Aloha\pedidos\" & fichero.Offset(0, 1).Value & ".xlsx"
    NombreNuevo1 = "C:\Aloha\pedidos\" & fichero.Offset(0, 1).Value & ".pdf"
    Name NombreViejo As NombreNuevo
    Name NombreViejo1 As NombreNuevo1
    Next fichero
    Else
    End If
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      deberías incluir el condicional .File.Exists dentro del bucle For each, para evaluar si existe o no el fichero NombreViejo
      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.