Macro excel vba et copier coller entre classeur

Résolu/Fermé
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016
- 9 févr. 2016 à 11:26
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016
- 10 févr. 2016 à 15:30
Bonjour,

Je souhaite votre aide pour créer une macro qui exécuterai cette tache :

- Copier le contenu de 5 cellules (A2, A4, A6, A8, A10) sur 50 tableurs excels de structure identiques localisés dans un dossier source.

- Coller ces contenus de cellule dans un tableur excel mère avec 1 ligne pour chaque tableur source. Chaque ligne aurait donc 5 colonnes remplies.

Le nombre de tableur source est en évolution.

Si l'un d'entre vous sait faire cette macro je lui demande son aide. ;)

4 réponses

michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277
9 févr. 2016 à 11:35
Bonjour
Chaque ligne aurait donc 5 colonnes remplies.

Colonnes jointives ou toute les 2 colonnes? ou se trouve la copie de A2 ?

ou se trouve le classeur avec 5 cellules (A2, A4, A6, A8, A10)

les classeurs "cible" ont ils un nom générique et quel suffixe Excel ?

Merci d'^tre précis et complet dans votre demande
1
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

9 févr. 2016 à 14:56
Michel_m

Oui chaque ligne du classeur mère aurait 5 colonnes remplies.

Il n'y a qu'une seule feuille dans les classeurs sources et mère

Les colonnes dans le classeur mère sont jointives.

La copie de A2 se trouve sur la cellule B2 du classeur mère,
La copie de A4 se trouve sur la cellule B3,
La copie de A6 se trouve sur la cellule B4,
La copie de A8 se trouve sur la cellule B5,
La copie de A10 se trouve sur la cellule B6.

Les classeurs cibles ont ce nom générique : "FO (X)" avec X allant de 1 à 50 minimum (le nombre n'est pas déterminé mais peut se limiter à 50).

S'il manque des informations je peux vous les fournir sans problème.
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277 > FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

Modifié par michel_m le 9/02/2016 à 15:38
OK, merci

un oubli de ma part:
on copie uniquement des valeurs ?
copie en feuille1?

Classeur cible xls, xlm, xlsx, xlsm ?
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

9 févr. 2016 à 16:30
Oui seuls des valeurs son ciblées

Toutes les données sont en feuille 1

Les tableurs sources sont en .xlsx et le tableur mère en .xlsm ;)
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277
Modifié par michel_m le 10/02/2016 à 14:02
re
me re voilà j'avais pigé l'inverse!
pas la forme today !

sans ouvrir les classeurs TO;xlsx

Option Explicit
Const Chemin As String = "D:\docus\" 'A adapter au contexte

Sub compiler_N_classeurs()
Dim Lig As Integer, Fich As String
Application.ScreenUpdating = False
With ActiveSheet
ChDir Chemin
Fich = Dir("TO" & "*.xlsx")
Lig = 2
While Fich <> ""
.Cells(Lig, "B") = ExecuteExcel4Macro("'" & Chemin & "[" & Fich & "]Feuil1'!R2C1") 'R2C1=A2
.Cells(Lig, "C") = ExecuteExcel4Macro("'" & Chemin & "[" & Fich & "]Feuil1'!R2C3") 'C2
.Cells(Lig, "D") = ExecuteExcel4Macro("'" & Chemin & "[" & Fich & "]Feuil1'!R2C5") 'E2
.Cells(Lig, "E") = ExecuteExcel4Macro("'" & Chemin & "[" & Fich & "]Feuil1'!R2C7") 'G2
.Cells(Lig, "F") = ExecuteExcel4Macro("'" & Chemin & "[" & Fich & "]Feuil1'!R2C9") 'I2
Lig = Lig + 1
Fich = Dir
Wend
End With
End Sub
1
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

10 févr. 2016 à 14:22
Re Michel !

Merci pour ce nouveau code !

Je l'ai intégré à visual basic en remplacant le chemin (à savoir pour moi : "C:\essai_copie") dans lequel sont présent mes fichiers xlsx.

L'exécution de la macro ne remplis rien dans le fichier mère ou la macro est implantée...

Y a t'il un autre élément à modifier ?
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277
10 févr. 2016 à 14:26
n'aurais tu pas oublier l'antislash car chez moi ca marche (enfin!)


"C:\essai_copie\"
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016
> michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022

10 févr. 2016 à 14:46
l'antislash est bien dans le chemin ciblée, j'ai intégré : Const Chemin As String = "C:\essai_copie\"

Je n'ai rien modifié d'autre.

Mon dossier est bien dans le lecteur C:

J'ai créé deux fichier sources nommés "FO(1)" et "FO(2)" dans lesquels les cellules A2,A4,A6,A8,A10 sont remplies (format de cellule texte) Ils sont ouverts avant l'exécution de la macro.

La macro est bien implantée dans le fichier mère "mere.xlsm" que j'ai placé dans le même dossier.

J'ai crée un bouton "controle de formulaire" pour exécuter la macro.

Je ne vois pas ce que qui cloche...
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 700 > FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

Modifié par pijaku le 10/02/2016 à 14:57
Dans la macro de Michel, écrire "FO" au lieu de "TO" :
Fich = Dir("TO" & "*.xlsx")
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016
> pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022

10 févr. 2016 à 15:29
Oui en effet !!! Merci Pijaku ! ;)

Le code fonctionne :) le code ne sélectionne pas encore les bonnes cellules dans les "fichiers source" mais je peux corriger tout seul ce détail :) Merci beaucoup pour votre aide précieuse ! :)
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277
Modifié par michel_m le 9/02/2016 à 17:12
OK
A demain dans la matinée

encore une question !!!
type de données copiées: texte, nombre, date ?

 Michel
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

9 févr. 2016 à 18:59
Les données copiées seront des textes ;)

D'accord, à demain, je resterai disponible: )

Bonne soirée
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277 > FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

10 févr. 2016 à 08:13
Bonjour
c'est parti
sois patient, y'a du boulot !
0
michel_m
Messages postés
16574
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
3 août 2022
3 277
Modifié par michel_m le 10/02/2016 à 10:20
Re,

J'avais tenté un truc sans ouvrir les fichiers (rapidité) mais c'est refusé depuis XL2007, hélas! :-(


Important écrire le dossier de la constante "Chemin"

Option Explicit
Const Chemin As String = "D:\docus\" 'A adapter au contexte

Sub copier_dans_N_classeurs()
Dim Col As Byte, Tablo, Cptr As Byte, Fich As String

Application.ScreenUpdating = False
ReDim Tablo(4)
With ActiveSheet
'Mémorisation des données à copier
For Col = 1 To 9 Step 2
Tablo(Cptr) = .Cells(2, Col)
Cptr = Cptr + 1
Next
End With

ChDir Chemin
Fich = Dir("TO" & "*.xlsx")
While Fich <> ""
Workbooks.Open (Chemin & Fich)
With ActiveWorkbook
Sheets("feuil1").Range("B2").Resize(1, 5) = Tablo
.Save
.Close
End With
Fich = Dir
Wend
End Sub


 Michel
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 700
Modifié par pijaku le 10/02/2016 à 11:29
Bonjour Michel,

Excuse l'incruste, mais je crois que tu as fait l'inverse de ce que demandais FixiF :
- Copier le contenu de 5 cellules (A2, A4, A6, A8, A10) sur 50 tableurs excels de structure identiques localisés dans un dossier source.

- Coller ces contenus de cellule dans un tableur excel mère avec 1 ligne pour chaque tableur source.

Les 5 cellules à copier sont dans les 50 classeurs, et ,il veut les coller dans un classeur "récap".
Ce qui t'as induit en erreur c'est ceci :
La copie de A2 se trouve sur la cellule B2 du classeur mère,
La copie de A4 se trouve sur la cellule B3,
La copie de A6 se trouve sur la cellule B4,
La copie de A8 se trouve sur la cellule B5,
La copie de A10 se trouve sur la cellule B6.

qu'il faut comprendre comme ceci, je pense :
La copie de A2 se trouve sur la cellule Bi du classeur mère,
La copie de A4 se trouve sur la cellule Ci,
La copie de A6 se trouve sur la cellule Di,
La copie de A8 se trouve sur la cellule Ei,
La copie de A10 se trouve sur la cellule Fi.
ou i est le numéro de la dernière ligne du classeur "mère" (récap)
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 700
10 févr. 2016 à 11:44
Si c'est le cas, et que je ne me goure pas, ce genre de code devrait convenir :
!!!Adapter les 3 constantes avec les noms des feuilles
Option Explicit

Const NomFeuilFichiers As String = "Feuil1" 'le nom commun à l'unique feuille des xxx fichiers
Const NomFeuilTemp As String = "Feuil2" 'le nom d'une autre feuille, vierge, du fichier mère
Const NomFeuilRecap As String = "Feuil1" 'le nom de la feuille du fichier mère qui accueille les données

Sub Import()
Dim objShell As Object, objFolder As Object
Dim Chemin As String, fichier As String

   Set objShell = CreateObject("Shell.Application")
   Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
   
   If objFolder Is Nothing Then
      MsgBox "Abandon opérateur", vbCritical, "Annulation"
   Else
      Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
      fichier = Dir(Chemin & "*.xlsx")
      Do While Len(fichier) > 0
         If fichier <> ThisWorkbook.Name Then
            ThisWorkbook.Names.Add "Plage", RefersTo:="='" & Chemin & "[" & fichier & "]" & NomFeuilFichiers & "'!$A$2:$A$10"
            With Sheets(NomFeuilTemp)
               .[A2:A10] = "=Plage"
               .Range("A2,A4,A6,A8,A10").Copy
               Sheets(NomFeuilRecap).Range("B" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
            End With
         End If
         fichier = Dir()
      Loop
      ThisWorkbook.Names("Plage").Delete
   End If
End Sub
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

10 févr. 2016 à 13:02
Bonjour,

Désolé pour ma réponse tardive...

Je vais intégrer le code pour tester !

Mais oui en effet comme dit pikaju les 5 cellules à copier sont dans les 50 classeurs sources, et l'idée est de les coller dans le classeur mère (ou "récap").

Est ce qu'on s'est mal compris ?
0
FixiF
Messages postés
10
Date d'inscription
mardi 9 février 2016
Statut
Membre
Dernière intervention
10 février 2016

10 févr. 2016 à 13:55
Re-bonjour !

Tout d'abord merci pour votre aide :)

j'ai donc testé les deux codes sources:

Le premier ne semble rien donner, l'implémentation de données dans le classeur mère ne s'effectue pas mais aucun message d'erreur.

Pijaku j'ai ensuite essayé ton code qui, une fois le dossier sélectionné, m'a écrit dans 5 colonnes sur une ligne "=page"

La partie du code :

With Sheets(NomFeuilTemp)
.[A2:A10] = "=Plage"

est elle à modifier ?

merci de votre aide :)
0