Se connecter avec
S'enregistrer | Connectez-vous

Copier cellules classeur(tot).feuil(lou) vers Classeur(lou).feuil(tot)

Dernière réponse : dans Programmation

Bonjour,
sous Excel, je gère des infos dans des fichiers C1 à CN, à chaque fois dans des onglets F1 à FP.

Je souhaite copier automatiquement vers la réciproque :

copier cellule(i,j) de l'onglet toto du classeur loulou
vers
cellule(i,j) de l'onglet loulou du classeur toto.

Dans ma base, je dois avoir en tout une vingtaine de noms différents de chaque toto et loulou..., soit environ 20 x 25 = 5000 combinaisons possibles...

Merci d'avance !!

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Si loulou.toto est la source et toto.loulou la cible, une chose importante à savoir est "La cible existe-t-elle déjà ?"

Si non, c'est facile :

  1. Function copie(Nom1 as String, Nom2 as String, i As Integer, j As Integer)
  2. Workbooks(Nom2).Worksheets(Nom1).Cells(i, j) = Workbooks(Nom1).Worksheets(Nom2).Cells(i, j)
  3. End Function


On peut aussi compliquer un peu plus les choses.
Un range, c'est une plage de cellules appartenant à une feuille (onglet) appartenant à un classeur.
  1. Function copie_range(rg As Range)
  2. Dim Nom1 As String
  3. Dim Nom2 As String
  4. Dim i As Integer
  5. Dim j As Integer
  6.  
  7. Nom1 = rg.Parent.Parent.Name
  8. Nom2 = rg.Parent.Name
  9. i = rg.Row
  10. j = rg.Columns
  11.  
  12. Workbooks(Nom2).Worksheets(Nom1).Cells(i, j) = rg.Value
  13. End Function


Bon, comme un range peut désigner toute une plage de cellule, il faut écrire la dernière ligne comme ça (1,1 = première cellule de la plage et non pas cellule A1) :
  1. Workbooks(Nom2).Worksheets(Nom1).Cells(i, j) = rg.Cells(1, 1).Value


Tiens, ça me donne une idée : pour jouer ;)  on va copier plusieurs cellules.
Et comme je suis fainéant, je vire les variables Nom1 et Nom2.
  1. Function copier_tout_un_range(rg As Range)
  2. Dim cel As Range
  3. Dim ws As Worksheet
  4.  
  5. Set ws = Workbooks(rg.Parent.Name).Worksheets(rg.Parent.Parent.Name)
  6.  
  7. For Each cel in rg
  8. ws.Cells(cel.Row, cel.Column).Value = cel.Value
  9. Next
  10. End Function
  11.  
  12. Sub Appel
  13. Msgbox "C'est parti !"
  14. copier_tout_un_range Workbooks("Toto").Worksheets("loulou").Range("A1:B3,C4")
  15. End Sub

Pour poser différemment mon problème, c'est un peu comme si je voulais créer une fonction qui prenne 2 chaines de caractères en argument... puis rebalancer ces deux arguments dans une ligne d'adresse.
Quelque chose du style :


  1. fonction copie (classeur,onglet,i,j)
  2. onglet.classeur.cellule(i,j)=classeur.onglet.cellule(i,j)
  3. fin fonction


ais le truc, c'est que je ne suis pas certain que ce soit une bonne idée de faire comme ça...

Voilà en substance ce que j'avais fait :

  1. Function copie_cellule(agent As String, projet As String, i, j) As Integer
  2. Dim nb As Integer
  3. Dim agent2, projet2, agent3 As String
  4.  
  5. agent2 = ""
  6. projet2 = ""
  7. nb = 1
  8.  
  9. agent2 = agent & ".xls"
  10. projet2 = projet & ".xls"
  11.  
  12. agent3 = " & agent2 & "
  13.  
  14. Workbooks(agent2).Worksheets(projet2).Cells(i, j).Copy
  15. Workbooks(projet2).Worksheets(agent2).Paste Destination = Cells(i, j)
  16. copie_cellule = nb
  17. End Function
  18.  
  19.  
  20.  
  21. Sub run()
  22. Dim toto As Integer
  23. toto = copie_cellule("mon_nom", "mon_projet", 11, 3)
  24. End Sub


et j'ai le bazard avec mes références de noms....

Merci beaucoup pour ton aide : je vais regarder ça attentivement.

Le truc, c'est que je me posais vraiment une question philosophique : est-ce une "bonne" méthode pour résoudre mon problème de fond (que des personnes différentes gèrent chacune un (un seul) fichier avec des tas d'onglets, et qu'on fasse un suivi par dossier (avec un onglet pour chaque agent concerné) ? ... ou non....

merci encore !
Expert Programmation

  1. source.Copy
  2. cible.Paste Destination = Cells(i, j)
Bah voyons !
Pour info, ceci ne peut pas fonctionner, Destination n'étant pas un attribut de Paste. Au contraire, c'est un attribut de Copy et je t'encourage à l'utiliser si tu veux tout copier, d'une cellule à l'autre, y compris les formules, les attributs, les couleurs, etc.

Mais dans ce cas, pourquoi utiliser la méthode Copy ? Utilise ça, c'est bien plus simple :
  1. Cellule1.Value = Cellule2.Value


Quant à tes problèmes métaphysiques, je suis désolé, je ne sais que répondre, sinon qu'Excel n'est pas vraiment fait pour faire de l'exploitation partagée, même si des mécanismes existent, laissant penser le contraire. Ta méthode ne me semble pas "mauvaise".
Lassé par la pub ? Créez un compte