Se connecter avec
S'enregistrer | Connectez-vous
Votre question

Excel : copier/coller des cellules vers une autre feuille

Dernière réponse : dans Programmation
Partagez
13 Mai 2009 14:01:01

Bonjour,

Je souhaite copier des cellules d'une feuille 1 vers une le première ligne vide d'une feuille 2. La feuille 1 est modifiée régulièrement et chaque modification renseigne un tableau sur la feuille 2 qui consitute en quelque sorte un historique des saisies de la feuille1. J'ai besoin de pouvoir réutiliser les valeurs des cellules de la feuille 2.

Je parviens à accéder à la première cellule vide de la dernière ligne (feuille 2) et à copier les cellule sur les cellules de la ligne selectionée.

Mais voilà : l'ensemble des lignes de la feuille 2 sont modifées de la même façon. Je souhaiterais que les lignes dont les cellules sont déjà renseignées ne soient pas modifiées.
La solution consiste sans doute à faire des copier + collages spéciaux (en valeur) de feuille1 vers feuille2. Comment puis-je m'y prendre ?

Merci d'avance


Voici mon code
  1. Sub Macro1()
  2. '
  3. 'Selectionne la feuille 2
  4. Sheets("Feuil2").Select
  5. ''feuille 2 : Récupére la derniére cellule non vide de la colonne à partir de A1
  6. casefin = Range("A1").End(xlDown).Address
  7. ''feuille 2 : Selectionne la cellule
  8. Range(casefin).Select
  9. 'feuille 2 : Selectionne la cellule directement en dessous
  10. ActiveCell.Offset(1, 0).Range("A1").Select
  11. 'copie la cellule B1 de la feuille 1 vers la cellule selectionnée sur la feuille 2
  12. ActiveCell.FormulaR1C1 = "='Feuil1'!R1C2"
  13. ' feuille 2 : Selectionne la cellule directement à droite
  14. ActiveCell.Offset(0, 1).Range("A1").Select
  15. 'copie la cellule B2 de la feuille 1 vers la cellule selectionnée sur la feuille 2
  16. ActiveCell.FormulaR1C1 = "='Feuil1'!R2C2"
  17. ' feuille 2 : Selectionne la cellule directement à droite
  18. ActiveCell.Offset(0, 1).Range("A1").Select
  19. 'copie la cellule B3 de la feuille 1 vers la cellule selectionnée sur la feuille 2
  20. ActiveCell.FormulaR1C1 = "='Feuil1'!R3C2"
  21. ' feuille 2 : Selectionne la cellule directement à droite
  22. ActiveCell.Offset(0, 1).Range("A1").Select
  23. 'copie la cellule D de la feuille 1 vers la cellule selectionnée sur la feuille 2
  24. ActiveCell.FormulaR1C1 = "='Feuil1'!R1C4"
  25.  
  26. End Sub

a b L Programmation
14 Mai 2009 12:02:48

Beurk :vomi:  Il y a longtemps que je n'avais pas vu un code aussi horrible.
Alors pour commencer, il faut virer tous les Machin.Select/Selection.Truc Machin.Activate/ActiveBidule.Truc et les remplacer par des Machin.Truc. C'est une question d'hygiène.

Ensuite, sers-toi d'une variable pour pointer la case en cours. C'est tellement plus facile. Au lieu d'utiliser l'adresse d'une cellule , utilise la cellule elle-même.
Moche :
  1. Dim casefin As String
  2. casefin = Sheets("Feuil2" ).Range("A1" ).End(xlDown).Address


Beau
  1. Dim casefin As Range
  2. Set casefin = Worksheets("Feuil2" ).Range("A1" ).End(xlDown)

Allez, c'est parti : casefin, ce n'est pas assez parlant. je l'appelle cible, parce que c'est là que je veux mettre mes données.
  1. Dim cible As Range
  2. Set cible = Worksheets("Feuil2").Range("A1").End(xlDown).Offset(1, 0)
  3. cible.FormulaR1C1 = "='Feuil1'!R1C2"
  4. Set cible = cible.Offset(0, 1)
  5. cible.FormulaR1C1 = "='Feuil1'!R2C2"
  6. Set cible = cible.Offset(0, 1)
  7. cible.FormulaR1C1 = "='Feuil1'!R3C2"
  8. Set cible = cible.Offset(0, 1)
  9. cible.FormulaR1C1 = "='Feuil1'!R1C4"

C'est mieux. Mais finalement, le coup de la cible, c'est un peu lourd. Revenons à ta première idée, on ne va garder que la case de fin :
  1. Dim casefin As Range
  2. Set casefin = Worksheets("Feuil2").Range("A1").End(xlDown)
  3.  
  4. casefin.Offset(1, 0).FormulaR1C1 = "='Feuil1'!R1C2"
  5. casefin.Offset(1, 1).FormulaR1C1 = "='Feuil1'!R2C2"
  6. casefin.Offset(1, 2).FormulaR1C1 = "='Feuil1'!R3C2"
  7. casefin.Offset(1, 3).FormulaR1C1 = "='Feuil1'!R4C1"

Ah, là ça a de le gueule !

Bon, en attendant, des données sur Feuil2 varient toujours en fonction de Feuil1.
C'est emmerdant, mais c'est exactement ce que tu demandes : Formule dans Feuil2 = Ceux qu'il y a en Feuil1.
En fait tu ne veux pas de formule, tu veux les valeurs :

  1. Dim casefin As Range
  2. Set casefin = Worksheets("Feuil2").Range("A1").End(xlDown)
  3.  
  4. casefin.Offset(1, 0).Value = Worksheets("Feuil1").Range("B1").Value
  5. casefin.Offset(1, 1).Value = Worksheets("Feuil1").Range("B2").Value
  6. casefin.Offset(1, 2).Value = Worksheets("Feuil1").Range("B3").Value
  7. casefin.Offset(1, 3).Value = Worksheets("Feuil1").Range("A4").Value


Qu'en penses-tu ?
Qu'on peut toujours mieux faire ? - Ben oui. Mais après, c'est une question de goût :

  1. Dim casedeb As Range
  2. Set casedeb = Worksheets("Feuil2").Range("A1")
  3.  
  4. Dim casefin As Range
  5. Set casefin = Worksheets("Feuil2").Range("A1").End(xlDown)
  6.  
  7. casefin.Offset(1, 0).Value = casedeb.OffSet(1, 0).Value
  8. casefin.Offset(1, 1).Value = casedeb.OffSet(1, 1).Value
  9. casefin.Offset(1, 2).Value = casedeb.OffSet(1, 2).Value
  10. casefin.Offset(1, 3).Value = casedeb.OffSet(0, 3).Value


:sol: 
m
0
l
15 Mai 2009 09:36:36

Bonjour Zeb, merci pour cette réponse détaillée et très explicite. J'avais fait le premier boutr de code avec l'enregistreur de macro, ce qui explique sans doute ta remarque initiale !

Je vais tester ta dernière proposition en tout cas.

Merci encore
m
0
l
a b L Programmation
15 Mai 2009 11:37:49

Eh, eh, si je me permets une telle entrée en matière, c'est qu'ensuite j'étaye mon discours ;) 
La lecture de cet article devrait t'être profitable.

m
0
l