jueves, 24 de septiembre de 2015

VBA: El método .CopyFolder o cómo COPIAR una carpeta de una ubicación a otra.

Como continuación al post del día anterior (el uso de método .MoveFolder), se plantea la cuestión sobre cuál sería la manera de COPIAR (no mover) carpetas entre distintas ubicaciones.

La respuesta, similar a la de post anterior, sería empleando el Objeto "Scripting.FileSystemObject", y para este caso concreto, un método asociado: .CopyFolder.
Es importante mencionar, que si la Carpeta origen contiene caracteres comodín o la Carpeta destino finaliza con un separador de ruta (barra invertida '\'), se supone que esta Carpeta destino es una carpeta existente en la que copiar las carpetas y subcarpetas coincidentes.
En caso contrario, se supone que la Carpeta destino es el nombre de una carpeta que se va a crear.

En cualquier caso, pueden ocurrir cuatro cosas cuando copiamos una carpeta:
1-Caso más habitual. Si no existe la Carpeta destino, se copian la carpeta origen y todo su contenido.
2-Si la Carpeta destino es un archivo existente, se produce un error.
3-Si la Carpeta destino es un directorio, se hace un intento de copiar la carpeta y todo su contenido. Si existe ya en la Carpeta destino un archivo contenido en la Carpeta origen, se produce un error si sobrescribir es False. Si no, se intentará copiar el archivo sobre el archivo existente.
4-Si la Carpeta destino es un directorio de sólo lectura, se produce un error si se hace un intento de copiar un archivo de sólo lectura existente en ese directorio y sobrescribir es False.


Con estas premisas, ya estamos en disposición de incorporar el código necesario...
Si vemos nuestro explorador de Windows, observamos la carpeta que deseamos copiar y pegar:
E:\excelforo\00CarpetaVieja

VBA: El método .CopyFolder o cómo COPIAR una carpeta de una ubicación a otra.



Insertamos nuestro código en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:

Sub Copiar_Carpeta()
'Para COPIAR una carpeta en cualquier otra Ubicación

Dim CarpetaOrigen As String, CarpetaDestino As String
'Indicamos los nombres y ubicaciones de la Carpeta a COPIAR...
CarpetaOrigen = "E:\excelforo\00CarpetaVieja"
CarpetaDestino = "E:\excelforo\00CarpetaNueva" & "_" & Format(Now(), "dd_mm_yyyy_hh_mm")
'OJO!!!: no podremos crear una carpeta ya existente!!!

'con este objeto proporcionamos acceso al sistema de archivos de nuestro equipo...
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

'controlamos que no hayamos terminado nuestra ruta con barra invertida \
'ni en la Carpeta Vieja
If Right(CarpetaOrigen, 1) = "\" Then
    CarpetaOrigen = Left(CarpetaOrigen, Len(CarpetaOrigen) - 1)
End If
'ni en la Nueva
If Right(CarpetaDestino, 1) = "\" Then
    CarpetaDestino = Left(CarpetaDestino, Len(CarpetaDestino) - 1)
End If
'También verificamos que existe la carpeta original a mover...
If FSO.FolderExists(CarpetaOrigen) = False Then
    MsgBox "EH!!!, esta " & CarpetaOrigen & " no existe!!!"
    Exit Sub
End If
'y que NO existe el destino....
If FSO.FolderExists(CarpetaDestino) = True Then
    MsgBox "Atención!!! la Carpeta" & CarpetaDestino & " ya existe..." & vbCrLf & _
    ", y NO es posible desplazarla a una Carpeta ya existente!!!"
    Exit Sub
End If

'Momento para copiar y pegar la ubicación de la Carpeta.
'Empleamos el método CopyFolder para copiar de un lugar a otro...
FSO.CopyFolder Source:=CarpetaOrigen, Destination:=CarpetaDestino

'mensaje de confirmación
MsgBox "Hemos copiado la Carpeta " & CarpetaOrigen & " y pegado en la nueva ubicación " & CarpetaDestino
End Sub



Tras ejecutar nuestra macro vemos como se ha producido el copiado y pegado (con nombre distinto) de nuestra carpeta origen....

VBA: El método .CopyFolder o cómo COPIAR una carpeta de una ubicación a otra.



No hay comentarios:

Publicar un comentario en la entrada