jueves, 3 de noviembre de 2016

VBA: Función FileCopy para copiar y mover ficheros desde Excel

Tocaremos un tema interesante y recurrente. La gestión de ficheros y carpetas desde Excel.
En particular hoy aprenderemos a usar la función VBA FileCopy.

Esta función se engloba en un conjunto de funciones de 'archivo/carpeta' como pueden ser (algunas ya vistas en el blog):
ChDir
ChDrive
Dir
FileCopy
FileDateTime
FileLen
GetAttr
Kill
MkDir
SetAttr
(en orden alfabético).


La que toca hoy FileCopy realiza un trabajo simple: copia un archivo desde una ubicación a otra.

Imaginemos el siguiente trabajo. Tenemos un listado en nuestra hoja de Excel donde disponemos de las equivalencias de una serie de archivos. Esta equivalencia responde a 'ubicación original' vs 'ubicación destino':

VBA: Función FileCopy para copiar y mover ficheros desde Excel



Notemos que al rango de celdas D2:D4 se le ha asignado un nombre definido 'origen', con el fin de facilitar el trabajo, y resulte más visual.

En un módulo estándar de nuestro proyecto de VB insertamos la siguiente macro 'CopiarARchivos':

Sub CopiarArchivos()
'recorremos cada celda del rango 'origen'
For Each celda In Range("origen")
    'determinamos la ruta original
    origen = celda.Value
    'y cuál es el destino
    destino = celda.Offset(0, 1).Value
    'con la función FileCopy copiamos de un lugar a otro
    FileCopy origen, destino
Next celda
End Sub



Tras ejecutar nuestro procedimiento, comprobaremos el resultado... ambos archivos ha sido pegados en su ubicación definitiva... incluso con el nuevo nombre de archivo.

VBA: Función FileCopy para copiar y mover ficheros desde Excel

Nota importante: Las rutas deben existir!!


OJO!!, no confundir con el método CopyFile, muy similar (casi idéntico en su composición), pero requiere la creación del objeto.

Sub CopiaArchivo()

Dim fso As Object
Set fso = VBA.CreateObject("Scripting.FileSystemObject")
'recorremos cada celda del rango 'origen'
For Each celda In Range("origen")
    'determinamos la ruta original
    origen = celda.Value
    'y cuál es el destino
    destino = celda.Offset(0, 1).Value
    'empleamos el método CopyFile
    fso.CopyFile origen, destino
Next celda
End Sub



El resultado es el mismo, la ventaja (según la documentación de Microsoft) es que el método es más eficiente y de mejor rendimiento...

4 comentarios:

  1. Muy bueno Ismael, permiteme felicitarte por tus aportes en esta maravilla de programa Excel.

    Necesito tu ayuda, para desarrollar un libro Mayor de contabilidad, con los siguientes requerimientos:

    Fecha - N° de cuenta - Nombre de Cuenta -Glosa - Detalle - Debe Haber - Saldo.

    De antemano.

    Atte.

    Aldo Moreno.

    ResponderEliminar
    Respuestas
    1. Gracias Aldo,
      Entiedno tienes ya u libro diario con todos los movimientos, y necesitas obtener el mayor de una u otra cuenta.
      Lo más simple sería aplicar un filtro avanzado sobre este libro diario, y emplear la opción de 'copiar a otro lugar' y así obtener el mayor de la cuenta deseada.

      Revisa la categoría de filtros del blog, y verás algunos ejemplos:
      http://excelforo.blogspot.com.es/search/label/Filtros

      Un saludo

      Eliminar
  2. Gracias por enseñar a las personas que necesitamos tus conocimientos.

    Me permiti compartir tu publicación en los Grupos de Facebook donde soy Administradora y los seguire compartiendo si me permites.

    ResponderEliminar
    Respuestas
    1. ;-)
      muchas gracias.. te lo agradezco.
      Un cordial saludo

      Eliminar