Macro copié/collé : modifier le répertoire source chaque mois
Bonjour à tous,
Je début en VBA et je bloque sur une problématique.
Je dois faire une macro qui va chercher des données dans 15 classeurs excels pour les copier dans 15 autres fichiers excels.
Le 1er fichier se nomme AAAAA1.xls sera copié dans AAAAA1_F.xlsX
Le 2eme fichier se nomme BBBBB1.xls sera copié dans BBBBB1_F.xlsX
Je compte faire 15 macros de copié/collé et une macro qui exécute toutes les macros à la suite.
Ce que je ne sais pas faire, c'est le changement de mois. En effet chaque mois, le chemin des fichiers a allez chercher va changer (01, 02, 03 ...etc), je l'ai mis en gras dans la macro ci dessous. Le nom des fichiers eux ne changent pas d'un mois sur l'autre.
Ce que j'aimerais. C'est que chaque mois on me demande de choisir le dossier 01, 02, 03 etc et que ce choix se fasse qu'une fois pour les 15 macros qui vont ensuite s'enchainer.
Je vous met ci dessous ma première macro, les 14 autres sont identiques, avec seulement el changement du nom des fichiers a allez chercher.
Merci par avance pour votre aide.
Sub AAAAA1()
'
' AAAAA1 Macro
'
'
Application.ScreenUpdating = False
Workbooks.Open Filename:= _
"C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\01\AAAAA1.xls"
Range("A2:O800").Select
Selection.Copy
Windows("Classeur1").Activate
Workbooks.Open Filename:= _
"C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\01\AAAAA1_F.xlsx"
Range("F2:T800").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close
Windows("AAAAA1.xls").Activate
ActiveWindow.Close
End Sub
Bonjour,
Voici un essai (non fonctionnel) pour préparer ce que vous cherchez à faire, avec 2 macros.
Sub MAJFICHIERS()
for i = 1 to 15
CheminSource$ = "C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\01\AAAAA1.xls" '<<<< rendre variable
CheminDest$ = "C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\01\AAAAA1_F.xlsx" 'rendre variable
Copier CheminSource, CheminDest
next i
end sub
Sub Copier(CheminSource$, CheminDest$)
Application.ScreenUpdating = False
'COPIE VALEURS
with Workbooks.Open(CheminSource) 'avec le fichier source ouvert à l'instant
t = .activesheet.Range("A2:O800").value 't (tableau dynamique) recoit les valeurs de la plage A2:O800 de la feuille active
.close true 'fermeture du classeur
end with
'COLLAGE
with Workbooks.Open(CheminDest) 'avec fichier destination
.activesheet.Range("F2:T800").value = t 'collage valeurs
.close true 'fermeture
end with
application.screenupdating = true
End SubIl faut juste arriver à définir (comment, c'est la question ?), la partie variable des chemins.
Cdlt,
Bonjour,
Je vous remercie vivement pour votre retour rapide.
Si je comprends bien, la première macro va permettre d'indiquer que pour les fichier 1 a 15, il faudra vers un copié coller : chemin source --> chemin destination.
Ensuite la seconde macro, c'est le copié coller, a répéter 15 pour tous les fichiers.
Qu'est ce que vous entendez par définir la partie variable des chemins ?
Cordialement
Oui, c'est ça.
La première macro sert à copier la plage A2:A800 d'un classeur source (dont le chemin est une variable rentrée en paramètre) pour la coller en valeurs dans la plage F2:T800 d'un classeur de destination (en paramètre également).
Donc ce code (qui ne s'exécute pas seul mais par un appel dans une macro principale) sert à rendre dynamique l'opération.
La première macro (principale) va l'appeler à 15 reprises. Mais il faut d'abord qu'on définisse les fameuses variables CheminSource et CheminDest. Et ça c'est à vous de me dire : comment obtenir les 2 chemins à chaque itération ?
Voici un exemple où tous les couples de fichiers AAAAAi et AAAAAi_F sont un même dossier (allant de 01 à 15) :
Sub MAJFICHIERS()
racine = "C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\" 'racine (chemin invariable)
for i = 1 to 15 'pour tous les dossiers (et a fortiori couples de fichiers)
CheminSource$ = racine & format(i, "00") & "\AAAAA" & i & ".xls" 'chSrc = racine & "\i\AAAAAi.xls" (i au format "00")
CheminDest$ = racine & format(i, "00") & "\AAAAA" & i & "_F.xlsx" 'idem
Copier CheminSource, CheminDest 'execute la macro pour le couple de fichiers en cours
next i
end subJ'ai un peu de mal à comprendre désolé
Donc CheminSource$ et CheminDest$ vont chercher la racine "C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\"
Ce que je comprend moins c'est : format(i, "00") a quoi correspond le i et le 00 ?
Ce qui va changer c'est le 01, 02, 03 de mon chemin "C:\Users\MyName\Desktop\DOSSIER PERMANENT 1\DOSSIER PERMANENT 2\01\AAAAA1.xls"
Chaque mois cela change. 01 = Janvier 02 = février
Et petit détail que je n'ai pas précisé, je ne sais pas si ca à son importance, le "range" sélectionné pour le copié /collé va changer d'un fichier à l'autre.
J'ai supposé que la racine serait la même (commune aux chemins des 2 fichiers, quel que soit le mois).
J'ai supposé que le sous-dossier contenant les fichiers serait 01, 02, ..., 15 (Sur ma planète, il y a 12 mois mais bon
J'ai supposé que le nom du fichier serait AAAAA1, ..., AAAAA15.
Voilà...
Sinon, il faut m'aider un peu car je ne suis pas un
Oui, si la range change, ça a son importance bien sûr puisqu'elle est définir en "dur" dans le code. Il faut la passer en paramètre également.
Pourriez-vous me préciser les conditions dans lesquelles s'exécutera la macro ?
J'ai édité mes messages pour y mettre des commentaires.
J'ai supposé que la racine serait la même (commune aux chemins des 2 fichiers, quel que soit le mois) : oui la racine est la même pour les deux fichiers. Seuls le 01, 02 .. etc changent selon le mois (pour deux fichiers également). En gros dans mon dossier 01, j'ai mes 15 couples de fichiers présents. Dans le 02 ce sera les mêmes ...etc
J'ai supposé que le sous-dossier contenant les fichiers serait 01, 02, ..., 15 (Sur ma planète, il y a 12 mois mais bon ). Le format(i, "00") sert à mettre les nombres inférieurs à 10 sous ce format justement. i est la variable de la boucle, qui va de 1 à 15. Les sous dossiers vont bien de 01 à 12 (on est bien sur la même planète :-D). C'est bien les "couples" de classeur excel qui sont au nombre de 15 (soit 30 classeurs)
J'ai supposé que le nom du fichier serait AAAAA1, ..., AAAAA15.: Oui j'ai simplifié les noms des fichiers, mais j'ai bien 15 racines noms de fichiers différents (car dans chaque couple il y a un xls et un xlsx, et le xlsx prend un _F en fin de nom)
Voilà...
Sinon, il faut m'aider un peu car je ne suis pas un . Désolé en effet, je me suis mal exprimé. Je débute en macro, et je dois pas parler le même langage que les initiés :-D
Oui, si la range change, ça a son importance bien sûr puisqu'elle est définir en "dur" dans le code. Il faut la passer en paramètre également. OK
Pourriez-vous me préciser les conditions dans lesquelles s'exécutera la macro ? Euh pas sur de bien comprendre. Le but c'est d'automatiser ces 15 copiés collés, et ne pas devoir changer la macro chaque mois. Chaque mois tout se répète la même façon les copiés collés de chaque couples se font sur le même range, tous les couples de fichiers sont déjà présents dans le sous dossier du mois (01,02 etc) avec exactement les mêmes noms.
Voila , en tout cas je vous remercie pour votre patience, dont je ne souhaite pas abuser.
Cdt
D'accord, je n'avais pas compris qu'il y avait 15 couples par dossier.
Donc, lors de l'exécution, il faut déterminer le mois j'imagine et pas faire tous les mois d'un coup (ce qui logique finalement).
Le nom de fichier AAAAA sera identique sur les 180 fichiers ?
Voici ce que vous avez écrit :
Et petit détail que je n'ai pas précisé, je ne sais pas si ca à son importance, le "range" sélectionné pour le copié /collé va changer d'un fichier à l'autre.
Justement, le but, c'est de rendre l'exécution fonctionnelle dans tous les cas. Donc j'ai besoin de connaitre les range de source et de destination dans chacun des cas pour dresser un modèle et conditionner la copie selon les cas. Est-ce que récupérer tout le contenu est envisageable sinon ? Est-ce que je peux avoir un aperçu des fichiers sinon mais sur un seul classeur en créant des onglets AAAAA1, AAAAA1_F, ..., et en indiquant ceux qui ont un format identique ?
Les fichiers AAAAA (j'ai inventé le nom ce n'est pas le vrai, les vrais nom sont imbuvables) ont bien 15 noms différents (+ la variante en _F,). Donc en gros 30 noms différents. Mais ces noms ne changent pas d'un mois à l'autre.
Pour l'instant j'ai juste fait ma première macro avec le range pour le fichier concerné. Je sais que les range vont changer pour chaque couple, mais je ne les ai pas encore répertoriés car j'attendais de voir si le changement de mois automatique était possible
Je ne peux malheureusement pas vous donner accès aux fichiers (confidentialité)
Question bête. Ne peut on pas juste en début de macro mettre un fonction (inputbox par exemple ???), qui permet de choisir le bon sous dossier (le mois en cours donc) et ensuite le reste de ma macro s'exécute dans le sous dossier sélectionné ?
Tout est possible ! Mais l'inputbox est contraire à la logique de l'automatisation, puisqu'il y a intervention humaine. Sachant que dans votre cas, ce ne sont pas les répertoires qui posent problème.
Ce sont principalement les plages (il faut savoir ce qu'on copie) et les noms de fichier car je comprends plus trop. Est-ce possible d'avoir un exemple des noms des fichiers du dossier 01 ? Et d'avoir un exemple de plage pour un fichier standard et son homologue ?
Quand on demande un fichier, c'est pour avoir une idée de la structure, on ne veut pas le vrai fichier. Je n'aime pas ouvrir les fichiers. Je réponds souvent à des sujets comme celui-ci et en général, je n'ai pas besoin de fichier car la demande est accompagnée d'informations détaillées (chemins, noms de fichier suivant les cas, plages suivant les cas). Les gens comprennent qu'ils doivent être précis car ils savent que c'est le seul moyen de trouver une solution.
Bonjour Emilien,
Voici un premier essai de code. Je considère que lorsqu'on exécute la macro, c'est pour agir sur le mois précédent. En mars, on copie les fichiers contenus dans le dossier 02.
Il faudra adapter le chemin bien sûr.
Il y a des fichiers de destination qui sont au format xslm, ça rend l'automatisation plus complexe, je dois passer par 2 boucles au lieu d'une.
Sur votre image, les fichiers de fin XXXXXPN1, XXXXXPO1 et XXXSA27 n'ont pas d'homologue. Il ne seront donc pas copiés.
J'ai aussi modifié le code pour qu'il copie toute la zone utilisée du fichier source car sinon, je ne sais pas quoi faire. Les copies viennent écraser les données précédentes donc il faudra bien faire des copies des fichiers avant essai.
Sub MAJFICHIERS()
dim tsource() as string, chemindest as string
mois = format(Month(application.eomonth(Date, -1)), "00")
dossier = "C:\...\...ette\Réa_" & mois & "\"
fichier = dir(dossier & "*.xls")
while fichier <> ""
if not fichier like "*_*" then
n = n + 1: redim preserve tsource(1 to n)
tsource(n) = dossier & fichier
end if
fichier = dir
wend
for i = lbound(tsource) to ubound(tsource)
sdest = dir(replace(tsource(i), ".xls", "_F.xls?"))
if sdest <> "" then
chemindest = dossier & sdest
Copier tsource(i), chemindest
end if
next i
end sub
Sub Copier(CheminSource$, CheminDest$)
Application.ScreenUpdating = False
'COPIE VALEURS
with Workbooks.Open(CheminSource) 'avec le fichier source ouvert à l'instant
t = .activesheet.usedrange.value 't (tableau dynamique) recoit les valeurs de la plage A2:O800 de la feuille active
.close true 'fermeture du classeur
end with
'COLLAGE
with Workbooks.Open(CheminDest) 'avec fichier destination
.activesheet.usedrange.cells(1, 1).resize(ubound(t), ubound(t, 2)).value = t 'collage valeurs
.close true 'fermeture
end with
application.screenupdating = true
End SubCdlt,
Bonjour,
Niquel je vous remercie.
Je test ca lundi au boulot, je vous tiens au courant.
Cordialement