Déplacer feuille dans plusieurs classeurs (Dossier / sous dossier)
Bonjour a tous,
J'ai besoin de déplacer (Copier) une feuille, dans plusieurs autres classeur, repartie dans plusieurs sous dossier d'un dossier.
Tous les classeur cible ont la meme architecture.
J'ai glané sur le net un bout de code, mais je n'arrive pas à le faire fonctionner.
Sub test()
Dim Fso As Object, MonRepertoire As String
Dim f1 As Object, f2 As Object, wb As Workbook
Set Fso = CreateObject("Scripting.FileSystemObject")
MonRepertoire = "C:\TEST\DEVIS\"
For Each f1 In Fso.GetFolder(MonRepertoire).SubFolders
For Each f2 In f1.Files
Set wb = Workbooks.Open(f2)
Workbooks("Outils Marge").Sheets("MARGE").Copy after:=ThisWorkbook.Sheets("DEVIS")
wb.Close
Next f2
Next f1
End SubEn fait je n'arrive pas à comprendre le principe du F1 et F2, par rapport a mon fichier de base, et au nom de mes fichiers cibles.
Bonjour,
f1 est une variable de boucle (une variable Folder, objet membre du filesystemobject). Elle sert à parcourir tous les sous-dossiers du répertoire "C:\TEST\DEVIS\".
f2 est une autre variable de boucle (variable File, autre objet du fso). Elle permet de parcourir tous les fichiers de chaque sous-dossier de DEVIS.
Donc, elles n'ont aucun rapport avec le fichier de base. f2 correspond à chaque fichier de destination (et on atteint chaque f2 via f1).
Quel point commun ont les fichiers de destination ? car votre code est peut-être encore un peu vague (il comprend tous types de fichier, quelqu'en soit le nom). Et d'ailleurs, ça me semble étrange d'avoir à copier une feuille à chaque fois dans plusieurs classeurs.
En tout cas, voici un essai en renommant les variables et en appliquant un premier filtre :
Sub test()
Dim Fso As Object, sfd As Object, fil As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
For Each sfd In Fso.GetFolder("C:\TEST\DEVIS\").SubFolders 'pour chaque sfd : subfolder
For Each fil In sfd.Files 'pour chaque fil : fichier
if fil.name like "*.xlsx" then '<<< exemple : filtre sur fichiers excel
with Workbooks.Open(fil.path)
Workbooks("Outils Marge").Sheets("MARGE").Copy after:=.Sheets("DEVIS") '<<< classeur Outils = thisworkbook ???
.activesheet.name = "MARGE " & format(now, "YYMMDD HHMM") '<<< on renomme pour éviter pb (pour l'instant, on ne teste pas l'existence de la feuille marge)
.Close true
end with
end if
Next fil
Next sfd
End SubCdlt,
Bonjour,
Merci pour ces premiers éléments de réponses.
Et d'ailleurs, ça me semble étrange d'avoir à copier une feuille à chaque fois dans plusieurs classeurs.
En fait j'ai un classeur me permettant de faire des devis, qui une fois rempli, génère une sauvegarde du classeur, ainsi qu'un export en PDF, dans un dossier correspondant au mois du devis.
Dernièrement j'ai intégrer une feuille "MARGE", pour les nouveaux devis, mais j'aimerais pouvoir contrôler la marge sur les anciens devis de l'année.
D'où la volonté de copier cette feuille vers tous les devis déjà fait.
Une fois fait, j'ai le code qui ira chercher les infos dans tous les classeur, pour les regrouper sur une seul feuille
Je me doutais que c'était quelque chose comme ça.
Comme j'aime le rabacher, il est de mon point de vue pas nécessaire de copier le classeur à chaque fois puisqu'on édite un PDF. A la place de cette copie, entrainant une prolifération des fichiers, il faut une base de données sur le fichier qui édite les devis et y enregistrer les informations de chaque nouveau devis à la suite des précédents. Tout restera groupé au même endroit !
Il faudrait y réfléchir pour la suite (et également à la nécessité d'avoir 12 sous-dossiers mensuels).
Mais ce n'est pas le sujet...
Cdlt,
Je suis d'accord avec toi, mais quand j'ai créer cette outils, je n'avais pas ces notions.
J'y pense justement pour la "V2", mais je ne maitrise pas encore le sujet (Je commence a titiller les base de données).
Mais il est tout aussi difficile de réfléchir a comment organiser tout cela, que de le réaliser
Néanmoins, ton code fonctionne parfaitement, j'ai juste des #Ref de partout
Ah oui, embêtant les #REF ! Je pense que la plupart des cellules dépendent d'une cellule qui dépend d'une référence du classeur d'origine qui n'est pas retrouvée sur le nouveau.
Pour la réflexion, il faut juste faire l'inventaire de tous les champs qui doivent se reporter dans la base et, pour chacun d'eux, créer une colonne dédiée.
Alors, juste après l'export en pdf, on reporte ces données (de la feuille DEVIS) dans la base, à la suite. Ainsi, toutes les infos sont regroupées et il est possible de consulter un devis grâce à son numéro et éventuellement de le modifier. La feuille DEVIS devient une simple interface de saisie et d'édition. Il est possible de passer par un userform sinon.
WikiCréa a fait un fichier dans ce sens, a base de formule RechercheV.
Merci beaucoup pour l'aide en tout cas
Je t'en prie !
Si c'est à base de recherchev, on remplit probablement la base j'imagine mais le principe est le même !
Tu devrais tout de même chercher sur le site, il doit probablement y avoir des fichiers permettant de faire des DEVIS.
Bonne continuation,