Se connecter / S'enregistrer
Votre question

Excel : copier/coller des cellules vers une autre feuille

Tags :
  • Copier coller
  • Programmation
  • VB
Dernière réponse : dans Programmation
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

Autres pages sur : excel copier coller cellules vers feuille

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
Contenus similaires
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
il y a moins d'une minute

Bonjour, alors si je remonte ce post qui commence à daté un peu, c'est que j'ai un peu prés la meme demande, sauf que je suis moins expérimenté.

Ma demande est :

Je possède 2 feuilles sur le même classeur qui s'appelle exactement Devis et facture.xlsm

les deux feuilles sont: FACTURE et SITUATION FACTURATION

Lorsque j'ai saisie une facture et que j'enregistre
J'aimerais qu'à chaque enregistrement, certaines cellule soit automatiquement copié sur SITUATION FACTURATION.

J'aimerais que :

Je doit faire ma facture F0098 en la sélectionnant dans mon menu déroulant, je veux que les cellules concernées soit recopier dans SITUATION FACTURATION à la suite de mon tableau (pour la F0098 la ligne correspondant est la 99)
DANS SITUATION FACTURATION la colonne A comporte les numéros de facture ex : A2 correspond à la facture F0001
A55 correspond à la F0054, donc prochaine facture à faire A99 pour la facture F0098

Voici ci dessous les cellules qui doivent être recopier a chaque enregistrement.

Nom du client en F11 sur FACTURE (liste déroulante qui s'appelle nomclient2) partent sur SITUATION FACTURATION en B99

adresse du client en F12 sur FACTURE partent sur SITUATION FACTURATION en C99

H32 sur FACTURE partent sur SITUATION FACTURATION en D99

H34 sur FACTURE partent sur SITUATION CLIENT en E99

D37 sur FACTURE partent sur SITUATION CLIENT en F99

MERCI mille fois et d'avance pour votre futur aide. :) 
m
0
l