VBA copie d'un répertoire à un autre

Fermé
Rapace - 10 avril 2008 à 09:41
 rorolidalgo - 2 nov. 2009 à 17:07
Bonjour,

Voilà, je souhaite parcourir une arborescence de répertoires, et de copier l'ensemble de leurs contenus dans une structure similaire (tout en renommant certains répertoires).

voici donc déjà le début de mon code que je teste avant d'aller plus loin.


Code :
Private Sub Commande0_Click()

Dim oFS As Variant, oLecteur As Variant, oRepertoire As Variant
Dim Boucle As Variant
Dim Dossier As Variant
Dim rep As String

On Error Resume Next

Set oFS = CreateObject("Scripting.FileSystemObject")
Set oLecteur = oFS.GetDrive("G")

Dossier = "\Corbeil documentations\customer\Actel\A3P060\Customer Data"
If (oLecteur.IsReady) Then
If (Dossier <> "") Then
'cteLecture à partir du sous-répertoire cible
Set oRepertoire = oFS.GetFolder(oLecteur & ":" & Dossier)
rep = "G:" & Dossier
Call ListeFichier(oRepertoire, rep) ' Routine récursive
End If
End If
Wscript.Echo "Fin de traitement :-) "

End Sub
'

Sub ListeFichier(ByVal oRepertoir As Variant, ByVal oRep As String) ' Routine récursive

Dim oDossier As Variant, oFichier As Variant
Dim Source, dest, racine_portal As String

On Error Resume Next

racine_portal = "G:\Corbeil doc for Portal\customer\Actel\A3P060\Customer Data"

If (oRepertoir.Files.Count > 0) Then
For Each oFichier In oRepertoir.Files
Source = oRep & "\" & CStr(oFichier)
dest = racine_portal & "\" & CStr(oFichier)
FileCopy Source, dest
Next
End If

If (oRepertoir.SubFolders.Count > 0) Then
For Each oDossier In oRepertoir.SubFolders
Call ListeFichier(oDossier, oDossier)
Next
End If

End Sub



Mon problème principal est que je n'arrive pas à récupérer le nom du variant oFichier pour le concaténer à mon chemin d'accès. Cela fait planter mon FileCopy...

Pouvez vous m'indiquer comment récupérer le nom( + extension) du variant oFichier SVP?

Bien sûr, toute autre idée, ou autre façon de faire pour améliorer ce code est la bienvenue....

merci d'avance
A voir également:

8 réponses

Utilisateur anonyme
13 avril 2008 à 05:38
re :

Alors voilà mes observations, vous confondez objets de scriptings et objets de VBA

Voici le script en vbs :
Dim oFS , oLecteur , oRepertoire 
'Dim Boucle 
Dim Dossier
Dim Rep 
Dim Compteur

On Error Resume Next 

Compteur=0
Set oFS = CreateObject("Scripting.FileSystemObject") 
Set oLecteur = oFS.GetDrive("R")
WScript.Echo "Lupin"
If (oLecteur.IsReady) Then 
	WScript.Echo "Lupin 1"
	Dossier = "\Forums\VBS" 
	'Dossier = "\Corbeil documentations\customer\Actel\A3P060\Customer Data" 
	'cteLecture à partir du sous-répertoire cible 
	Rep = "R:" & Dossier 
	Set oRepertoire = oFS.GetFolder(Rep)
	WScript.Echo oRepertoires.SubFolders.Count
	Call ListeFichier(oRepertoire, Rep) ' Routine récursive 
End If 

Wscript.Echo "Fin de traitement :-) " & Compteur

WScript.Quit(0)
'End Sub 
' 

Sub ListeFichier(oRepertoir, oRep ) ' Routine récursive 

Dim oDossier , oFichier  
Dim Source, dest, racine_portal 

On Error Resume Next 

Compteur = ( Compteur + 1 )
'racine_portal = "G:\Corbeil doc for Portal\customer\Actel\A3P060\Customer Data" 
racine_portal = "S:\Lecteur\Transport"
WScript.Echo = oRepertoir.Files.Count
If (oRepertoir.Files.Count > 0) Then 
	For Each oFichier In oRepertoir.Files 
		Source = oRep & "\" & oFichier.Name
		WScript.Echo Source
		dest = racine_portal & "\" & oFichier.Name
		WScript.Echo dest
		oFS.CopyFile Source, dest 
	Next 
End If 

If (oRepertoir.SubFolders.Count > 0) Then 
	For Each oDossier In oRepertoir.SubFolders 
		Call ListeFichier(oDossier, oDossier) 
	Next 
End If 

End Sub 


et maintenant le même code mais sous VBA !

Option Explicit

Dim oFS As Object, oLecteur As Object, oRepertoire As Object
Dim Compteur As Long

Private Sub CommandButton1_Click()

Dim Boucle As Long
Dim Dossier As String
Dim Rep As String

On Error Resume Next

Compteur = 0
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oLecteur = oFS.GetDrive("R")
'WScript.Echo "Lupin"
MsgBox "Lupin"
If (oLecteur.IsReady) Then
    'WScript.Echo "Lupin 1"
    MsgBox "Lupin 1"
    Dossier = "\Forums\VBS"
    'Dossier = "\Corbeil documentations\customer\Actel\A3P060\Customer Data"
    'cteLecture à partir du sous-répertoire cible
    Rep = "R:" & Dossier
    Set oRepertoire = oFS.GetFolder(Rep)
    MsgBox oRepertoire.SubFolders.Count
    'WScript.Echo oRepertoires.SubFolders.Count
    Call ListeFichier(oRepertoire, Rep) ' Routine récursive
    Compteur = (Compteur + 1)
End If

'WScript.Echo "Fin de traitement :-) " & Compteur
MsgBox "Fin de traitement :-) " & Compteur

End Sub
'

Sub ListeFichier(oRepertoir As Object, oRep As Object)  ' Routine récursive

Dim oDossier As Object, oFichier As Object
Dim Source As String, dest As String, racine_portal As String

On Error Resume Next

'racine_portal = "G:\Corbeil doc for Portal\customer\Actel\A3P060\Customer Data"
racine_portal = "S:\Lecteur\Transport"
'WScript.Echo = oRepertoir.Files.Count
MsgBox oRepertoir.Files.Count
If (oRepertoir.Files.Count > 0) Then
    For Each oFichier In oRepertoir.Files
        Source = oRep & "\" & oFichier.Name
        MsgBox Source
        'WScript.Echo Source
        dest = racine_portal & "\" & oFichier.Name
        MsgBox dest
        'WScript.Echo dest
        oFS.CopyFile Source, dest
    Next
End If

If (oRepertoir.SubFolders.Count > 0) Then
    For Each oDossier In oRepertoir.SubFolders
        Call ListeFichier(oDossier, oDossier)
    Next
End If

End Sub
'


remarquer surtout que les lignes :

Dim oFS As Object, oLecteur As Object, oRepertoire As Object
Dim Compteur As Long

définit les variables pour tout le module et seront connue de chaque routine.

De plus, votre code copie les fichiers mais pas la structure des répertoires que vous copiers.

Je vous recommande plus une commande comme oFS.CopyFolder (Source , Destination)

Lupin
3
CStr(oFichier) ne fonctionne pas...comment puis-je récupérer le nom de mon fichier SVP??

Merci d'avance
0
Utilisateur anonyme
10 avril 2008 à 13:34
Bonjour,

L'instruction : dest = racine_portal & "\" & CStr(oFichier)

devrait se lire : dest = racine_portal & "\" & oFichier.Name

Lupin
0
Merci , je vais tester.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
11 avril 2008 à 13:37
re :

tout comme :

Source = oRep & "\" & CStr(oFichier)

Source = oRep & "\" & oFichier.Name

Lupin
0
j'avais déjà changé pour "Source" également mais ma macro ne fonctionne toujours pas. Je n'ai pas de message d'erreur c'est juste que ma macro ne fait rien.

J'ai mis un "msgbox oFichier.Name" dans ma boucle mais ça affiche une chaine vide...

D'où peut venir le problème d'après vous? Mes chemins de données sont bons et le répertoire source contient des fichiers, j'ai vérifié.
0
Meric beaucoup Lupin, j'avoue ne pas avoir compris la subtilité entre ton code VBS et ton code VBA.
Le problème vindrait du fait que j'ai utilisé des Variant plutot que des Object, c'est ça??

Je vais également tester le CopyFolder. Cela copie tout un répertoire? avec son arborescence complète et son contenu?? (si c'est le cas, je vais pouvoir me passer de ma boule récursive).
0
Utilisateur anonyme
14 avril 2008 à 14:31
re :

non, ce n'est pas le typage qui était en cause !

Instruction avec des objets VBA
FileCopy Source, dest

Instruction avec des objets de scripting
oFS.CopyFile Source, dest

Il faudra apprendre a distinguer les objets de scripting, codable dans le bloc-note
et les objets VBA codable sous VBE.

et, oui, la commande CopyFolder copie tout le contenu.

Lupin
0
Bonjour

Je suis face à un problème similaire, où je souhaite déplacer un dossier et son contenu selon des variables en amont.

Je cherche à faire la manipulation suivante

Déplacer le contenu de chemin_1\dossier_1 vers chemin_2 \ dossier_2.

Je suis en VBA, c'est pour une gestion documentaire pilotée depuis Access.

Merci d'avance
0
rorolidalgo > SeB
2 nov. 2009 à 17:07
Bonjour Seb,

j'ai le même problème que toi: je souhaite faire une copie complète d'un dossier avec ses sous-dossiers et ses fichiers à part d'Access et le renommer ensuite.
As-tu trouvé la solution à ton problème?

Merci d'avance,
0