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.



11 comentarios:

  1. Saludos, camaradas
    Probé la macro y funciona perfecto. Ahora quiero saber que instrucción cambiar para copiar toda la carpeta SI ÉSTA EXISTE

    ResponderEliminar
    Respuestas
    1. Hola,
      pues es emplear el método .CopyFolder que se emplea en la macro.

      Slds

      Eliminar
  2. Tengo un problema, me funciona perfectamente pero ocurre una cosa curiosa. Si en Windows copio y pego manualmente, desde un móvil Android puedo ver dicha carpeta, si lo copio y pego con vba, desde el móvil no me permite verla. A comentar que lo hago en una empresa con dominio, pero los permisos están bien establecidos. Alguna idea?? Existe la posibilidad en vba de cuando copias también establecer permisos? Es que ya no se que hacer.... Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Joan, qué tal estás?
      Un placer saludarte igualmente.
      Puede ser un tema del sistema operativo... En todo caso las acciones de copiado y pegado desde VBA no permite establecer permisos sobre lo pegado.
      Saludos cordiales

      Eliminar
  3. Hola: Cómo puedo hacer para pegar en una sub carpeta. Gracias de antemano. Me sirvió de mucho tu ayuda!

    ResponderEliminar
    Respuestas
    1. Hola
      solo define las variables
      CarpetaOrigen = "E:\excelforo\00CarpetaVieja"
      CarpetaDestino = "E:\excelforo\00CarpetaNueva"
      con la ruta deseada.. con o sin subcarpetas.
      Como ves en el ejemplo se utilizan 'subcarpetas'
      Saludos

      Eliminar
  4. Hola,
    Gracias por el post y su blog. Aprendo mucho siguiéndolo.
    En su código, la carpeta destino tiene una ruta fija. ¿Habría alguna manera de poder elegir la ruta de destino cada vez que se use la macro? Que la ruta de destino fuese "variable", como una especie de "Guardar como" y poder selecionar donde pegar la copia de la carpeta origen.
    Muchas gracias de antemano. Reciba un cordial saludo.

    ResponderEliminar

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