Macro pour coller à la suite.

Résolu
François87 -  
 François87 -
Bonjour,

Dans un classeur excel avec un première feuille pour rentrer des données, en validant, ces données doivent être copiées sur une autre feuille à la suite des données précédentes.

J'essaye de réaliser une macro qui quand je clique sur "valider", copie les cellules voulues dans une autre feuille mais dans la ligne suivante à chaque fois.

J'ai essayé avec ce code :

Sub essai()

Dim wb As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set wb = ThisWorkbook
Set ws1 = wb.Worksheets("DATA INPUT")
Set ws2 = wb.Worksheets("Nuité, PLat, Dessert")

ws2.Range("b1").End(xlDown).Offset(1, 0) = ws1.Range("b8")
ws2.Range("c1").End(xlDown).Offset(1, 0) = ws1.Range("b9")
ws2.Range("d1").End(xlDown).Offset(1, 0) = ws1.Range("b10")
ws2.Range("k1").End(xlDown).Offset(1, 0) = ws1.Range("b15")
ws2.Range("l1").End(xlDown).Offset(1, 0) = ws1.Range("b19")

End Sub

Mais à chaque fois il écrase les données précédemment validées.

D'avance merci pour vos conseils.

PS : Comment faut-il faire pour mettre le classeur en pièce jointe, ce serait plus simple.

1 réponse

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    With ws2
         lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
         .Cells(lig, "B") = ws1.Range("B8")
         '.... la suite
    End With

    pour les messages suivant

    1/
    pour joindre une pièce
    mettre le classeur sans données confidentielles en pièce jointe sur
    https://www.cjoint.com/
    et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse

    2/
    mettre tes codes entre les balises <> du bouton à droite en haut du message. Merci d'avance
    0
    1. françois87
       
      Bonjour Michel,

      Tout d'abord merci de votre réponse rapide. J'ai modifié ma macro en suivant vos conseils et cela me donne :

      Sub essai ()
      Dim wb As Workbook
      Dim ws1 As Worksheet
      Dim ws2 As Worksheet
      
      
      Set wb = ThisWorkbook
      Set ws1 = wb.Worksheets("DATA INPUT")
      Set ws2 = wb.Worksheets("Nuité, PLat, Dessert")
      
      
      
      With ws2
           lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
           .Cells(lig, "B") = ws1.Range("B8")
      End With
      
      With ws2
          lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
          .Cells(lig, "c") = ws1.Range("b9")
      End With
      
      With ws2
          lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
          .Cells(lig, "d") = ws1.Range("b10")
      End With
      
      With ws2
          lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
          .Cells(lig, "k") = ws1.Range("b15")
      End With
      
      With ws2
          lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
          .Cells(lig, "l") = ws1.Range("b19")
      End With
      
      
      
      End Sub
      


      Mais cela ne fonctionne pas car le collage se fait en dessous de mon tableau et décalé sur chaque colonne..

      Veuillez trouver ci-joint le classeur sur lequel je travail :
      http://cjoint.com/?ALqj2Dv4Kcl

      D'avance merci pour vos conseils.
      François
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,
      Salut michel,
      Excusez l'incruste...
      Il est tout à fait normal que ça te décale tes données puisque pour chaque colonne tu recalcules la dernière ligne saisie. L'exemple de michel concernait une seule donnée, il suffit de mettre les autres dessous dans le même bloc with sans recalculer le numéro de la ligne :
      With ws2
           lig = .Cells.Find("*", , , , , xlPrevious).Row + 1
           .Cells(lig, "B") = ws1.Range("B8")
          .Cells(lig, "c") = ws1.Range("b9")
          .Cells(lig, "d") = ws1.Range("b10")
          .Cells(lig, "k") = ws1.Range("b15")
          .Cells(lig, "l") = ws1.Range("b19")
      End With

      ça devrait le faire...
      0
    3. françois87
       
      Une fois de plus merci pour la rapidité de la réponse. J'avais effectivement mal compris comment cela fonctionne, maintenant il me copie tout sur la même ligne mais il commence en dessous de mon tableau (la dernière ligne du tableau étant utilisée. Est-il possible que la macro prenne en compte la première cellule vide à l'intérieure du tableau et non à la fin du tableau.
      D'avance merci
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Je vois ce que tu veux dire. Cependant, ne voyant pas l'intérêt de faire des "tableaux" je ne vois pas de différence...
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Sinon, le code pour la première ligne vide colonne A :
      lig = Range("A1").End(xlDown).Row + 1
      A la condition expresse que toutes les cellules soient "remplies"...
      0