Excel : copier/coller des cellules vers une autre feuille

  • Auteur de la discussion cartoiide
  • Date de début

cartoiide

Habitué
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
[cpp]
Sub Macro1()
'
'Selectionne la feuille 2
Sheets("Feuil2").Select
''feuille 2 : Récupére la derniére cellule non vide de la colonne à partir de A1
casefin = Range("A1").End(xlDown).Address
''feuille 2 : Selectionne la cellule
Range(casefin).Select
'feuille 2 : Selectionne la cellule directement en dessous
ActiveCell.Offset(1, 0).Range("A1").Select
'copie la cellule B1 de la feuille 1 vers la cellule selectionnée sur la feuille 2
ActiveCell.FormulaR1C1 = "='Feuil1'!R1C2"
' feuille 2 : Selectionne la cellule directement à droite
ActiveCell.Offset(0, 1).Range("A1").Select
'copie la cellule B2 de la feuille 1 vers la cellule selectionnée sur la feuille 2
ActiveCell.FormulaR1C1 = "='Feuil1'!R2C2"
' feuille 2 : Selectionne la cellule directement à droite
ActiveCell.Offset(0, 1).Range("A1").Select
'copie la cellule B3 de la feuille 1 vers la cellule selectionnée sur la feuille 2
ActiveCell.FormulaR1C1 = "='Feuil1'!R3C2"
' feuille 2 : Selectionne la cellule directement à droite
ActiveCell.Offset(0, 1).Range("A1").Select
'copie la cellule D de la feuille 1 vers la cellule selectionnée sur la feuille 2
ActiveCell.FormulaR1C1 = "='Feuil1'!R1C4"

End Sub
[/cpp]
 

zeb

Modérateur
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 :
Code:
Dim casefin As String
casefin = Sheets("Feuil2" ).Range("A1" ).End(xlDown).Address

Beau
Code:
Dim casefin As Range
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.
Code:
Dim cible As Range
Set cible = Worksheets("Feuil2").Range("A1").End(xlDown).Offset(1, 0)
cible.FormulaR1C1 = "='Feuil1'!R1C2"
Set cible = cible.Offset(0, 1)
cible.FormulaR1C1 = "='Feuil1'!R2C2"
Set cible = cible.Offset(0, 1)
cible.FormulaR1C1 = "='Feuil1'!R3C2"
Set cible = cible.Offset(0, 1)
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 :
Code:
Dim casefin As Range
Set casefin = Worksheets("Feuil2").Range("A1").End(xlDown)

casefin.Offset(1, 0).FormulaR1C1 = "='Feuil1'!R1C2"
casefin.Offset(1, 1).FormulaR1C1 = "='Feuil1'!R2C2"
casefin.Offset(1, 2).FormulaR1C1 = "='Feuil1'!R3C2"
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 :

Code:
Dim casefin As Range
Set casefin = Worksheets("Feuil2").Range("A1").End(xlDown)

casefin.Offset(1, 0).Value = Worksheets("Feuil1").Range("B1").Value 
casefin.Offset(1, 1).Value = Worksheets("Feuil1").Range("B2").Value 
casefin.Offset(1, 2).Value = Worksheets("Feuil1").Range("B3").Value 
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 :

Code:
Dim casedeb As Range
Set casedeb = Worksheets("Feuil2").Range("A1")

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

casefin.Offset(1, 0).Value = casedeb.OffSet(1, 0).Value 
casefin.Offset(1, 1).Value = casedeb.OffSet(1, 1).Value 
casefin.Offset(1, 2).Value = casedeb.OffSet(1, 2).Value 
casefin.Offset(1, 3).Value = casedeb.OffSet(0, 3).Value

:sol:
 

cartoiide

Habitué
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
 

zeb

Modérateur
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 devrait t'être profitable.

 

Pouns94

Nouveau membre
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. :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 049
Membres
1 586 392
Dernier membre
jpaulNonDispo
Partager cette page
Haut