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.

36 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
  10. hola companero,
    hice un poco de codigo en vba excel y los datos que recabo por medio de un formulario los voy poniendo en una plantilla/cuando mando a impresion a archivo quiero que el nombre de ese archivo sea lo contenido en una celda de esa plantilla pero no he podido, se agradece la ayuda que puedas prestarme

    ResponderEliminar
    Respuestas
    1. Hola Rafael,
      deberías crear una variable tipo String para componer el nombre del archivo; mejor que contenga la ruta completa:
      nombre="E:\Excelforo\" & range("A11").value & ".xlsx"
      Saludos

      Eliminar
  11. Siguiendo el codigo que hiciste, la macro se queda en el codigo Name NombreViejo As NombreNuevo; los ficheros estan bien, la srutas igual; etsoy usando excel 2010.

    ResponderEliminar
    Respuestas
    1. Hola, cómo estás?
      un placer poder colaborar contigo

      Revisa el código y las rutas (especialmente si has dispuesto correctamente los separadores \) y que los ficheros existen...

      el código sigue funcionando correctamente

      Un cordial saludo

      Eliminar
  12. Hola buen dia, ya tengo varios dias con este problema jeje he revisado varios foros y segun yo el codigo esta bien pero nadamas no logro sulucionar el problema :-(, Necesito renombrar archivos JPG de una carpeta en especifico pero al correr la macro siempre me manda el error FILE NOT FOUND ya revise y la ruta es correcta, el archivo esta ahi no se que pueda ser
    este es el codigo:

    Sub CambiarNombres()

    Dim NombreViejo As String
    Dim NombreNuevo As String
    Dim Fe As Date
    Dim Ho As String

    For Each Fichero In Range("A2:A6")

    Direccion = Range("H2").Value
    Fe = Date
    Ho = Format(Now, "HH:MM")

    NombreViejo = "C:\Users\My Documents\Analisis\Ciclos\" & Fichero.Value & ".Jpg"
    NombreNuevo = "C:\Users\My Documents\Analisis\Ciclos\" & Fichero.Value & "_" & Fe & "_" & Ho & ".Jpg"

    'Aqui coloca la direccion completa para ver como quedaria cada archivo pero no logra encontrarlo :-(
    Range("H15") = NombreViejo
    Range("H16") = NombreNuevo

    Name NombreViejo As NombreNuevo

    Next Fichero
    End Sub

    ResponderEliminar
  13. De echo si ingreso la direccion completa "C:\Users\My..\archivo.jpg" que es igual a la que arroja la formula si funciona :-(, no se por que no toma la formula como un texto simple para tomarlo como direccion a buscar y cambiar

    ResponderEliminar
  14. Ya di con el error :-), Gracias !

    ResponderEliminar
    Respuestas
    1. Hola buen dia, ahora es otro :-( al principio no encontraba el archivo, eso lo resolvi, funciono cuando puse el codigo, lo guarde y despues de eso realice un cambio de la hoja de calculo de carpeta para ya dejarla donde deveria estar y al correr la macro me mando este error: Run-time error '5': Invalid procedure call or argument, ya me busque y no logro encontrar la solucion para que este error ya no aparesca, tengo muchas macros y solo con este codigo sale ese error :-( help !!

      Eliminar
    2. Use el comando ActiveWorkbook.Path para que la dirección de donde están los archivos fuera mas corto y a partir de ahi trono todo, lo regrese al formato de dirección larga "C:\Micarpeta\Archivos etc . . ." pero ni asi se quita el error :-(

      Eliminar
    3. Sub CambiarN()
      Dim NombreViejo As String
      Dim NombreNuevo As String

      For Each Fichero In Range("H2:H7")

      NombreViejo = "C:\Users\VazquezA\Documents\My Documents\Analisis Realizados\Ciclos\" & Fichero.Value & ".jpg"
      NombreNuevo = "C:\Users\VazquezA\Documents\My Documents\Analisis Realizados\Ciclos\" & Fichero.Offset(0, 1).Value & ".jpg"

      Name NombreViejo As NombreNuevo
      Next Fichero
      End Sub

      Eliminar
    4. ¿qué nombres son los que aparecen en las celdas?
      ¿quizá tengan algún caracter no válido??
      ¿has probado con una ruta diferente que no esté en el escritorio?

      Eliminar
  15. Hola buen dia, cambie la dirección a un directorio mas directo como es C:\Temp para que sea mas coro y modifique lo que quiero como nombre, pero lo que me da el error es usar datos de hora al cambiar el nombre del archivo (IF(H2="","",H2&"-Rep-"&TEXT(TODAY(),"dd-mmm")&"-"&TEXT(NOW(),"HH:MM")), esa variable no la acepta, ya revise y realice pruebas, funciona siempre y cuando no use dentro de la formula que arroja el nombre la formula de TEXT(NOW(),"HH:MM"), no se por que si al final todo se covierte a texto y se guarda como un string, pero bueno ya modifique la formula y funciono, tambien arroja ese mismo error si el nombre del archivo no es valido algo asi como C:\Temp\MyArchivo.jpgxl

    Gracias por tu ayuda, Saludos !

    ResponderEliminar
    Respuestas
    1. Hay ciertos caracteres que no están admitidos en los nombres de los ficheros y/o rutas, por ejemplo, uno típico es la barra /
      otro son los dos puntos :

      Saludos!

      Eliminar
  16. Copio el codigo tal cual y me da error en la linea de Name NombreViejo As NombreNuevo, por error 53 ¿?

    ResponderEliminar
    Respuestas
    1. Hola
      el código estará bien, pero el error 53 te indica que no encuentra el archivo, asi que revisa la ruta y el nombre de los ficheros...
      Saludos

      Eliminar

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