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
Insertamos nuestro código en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:
Tras ejecutar nuestra macro vemos como se ha producido el copiado y pegado (con nombre distinto) de nuestra carpeta origen....
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
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....
Saludos, camaradas
ResponderEliminarProbé la macro y funciona perfecto. Ahora quiero saber que instrucción cambiar para copiar toda la carpeta SI ÉSTA EXISTE
Hola,
Eliminarpues es emplear el método .CopyFolder que se emplea en la macro.
Slds
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
ResponderEliminarHola Joan, qué tal estás?
EliminarUn 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
Hola: Cómo puedo hacer para pegar en una sub carpeta. Gracias de antemano. Me sirvió de mucho tu ayuda!
ResponderEliminarHola
Eliminarsolo 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
Código genial, Gracias!!
ResponderEliminar;-)
Eliminarsaludos!
Hola,
ResponderEliminarGracias 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.
Hola Haw,
Eliminarpuedes emplear este otro método
https://excelforo.blogspot.com/2010/04/explorador-en-vba.html
para seleccionar el destino...
Saludos
Muchas Gracias!!
ResponderEliminar