VBA Copier des lignes avec plusieurs conditions

Résolu
Bonjour, j'aimerais avoir votre aide svp. Je suis débutante avec vba et je n'arrive pas à trouver une solution à mon problème après avoir essayé plusieurs solutions trouvées sur votre site.

Bon j'ai un fichier Excel qui comporte 2 onglets. Un onglet parents et un onglet enfant.
Mon objectif : Ajouter les noms des enfants ( de l'onglet enfants) dans l'onglet parents. ( Copier-coller)
Dans l'onglet parents, sur chaque ligne, il y a le nom de chaque parent et de plusieurs autres infos telles que son salaire son emploi son âge etc..
Dans l'onglet enfant, sur chaque ligne, il y a aussi le nom du parent puis les infos sur son enfant (tout ça sur la même ligne) .
Si le parent a plusieurs enfants, ( Par exemple, s'il a 3 enfants, les noms des enfants seront écrits sur 3 lignes qui se suivent). Donc pour chacune des lignes des enfants, il y a d'abord le nom du parent puis le nom de l'enfant, son âge, son sexe etc....

Ce que j'essaie de faire c'est que (par ex pr un parent avec 3 enfants)
dans l'onglet parents, ou il y a déjà le nom du parent, le code va permettre d'ajouter les infos des enfants et les 3 lignes de l'onglet enfants vont se copier-coller sur l'unique ligne de l'onglet parents.

Merci de m'aider svp!!! E n'hésitez pas à me poser des questions pour que ce soit plus clair.

14 réponses

  1. Bonjour,

    Si j'ai bien compris la structure de tes deux feuilles, il doit suffire de faire un copier - coller des données de la feuille enfants vers la feuille parents puis un tri sur la colonne nom.

    Sinon, tu as tout intérêt à poster un fichier exemple pour montrer la disposition des données.

    A+
    0
    1. Bonjour, Merci d'avoir répondu :). Comment on fait pour poster un fichier exemple?? Je n'arrive pas à joindre mon fichier excel.
      0
      1. Pour avoir la même structure dans les deux feuilles.
        - dans la feuille enfant, j'ai inséré une colonne (D) pour la profession.
        - dans la feuille Parents, j'ai ajouté les libellés d'en-tête manquants (Enfant Nom, Enfant Prénom,etc.)

        Ensuite,
        - dans la feuille enfant, j'ai copié la plage A2:H9
        - dans la feuille Parents, j'ai effectué le collage (CTRL + V) en A6

        Enfin, pour réaliser le tri
        - j'ai sélectionné la plage A1:H13
        - clic sur Trier > Tri personnalisé > Trier par Nom sur Valeurs de A à Z > OK

        https://www.cjoint.com/?DIypt1VKhRt

        A+
        0
        1. Merci beaucoup pour votre aide. Tout fonctionne parfaitement.
          Est-ce possible de m'expliquer un peu ce que vous avez fait? Au moins si je change des choses je pourrai personnaliser le code à chaque fois.
          Pouvez-vous m'expliquer ce que ces parties signifient surtout l'histoire des offset
          For Each Cel In Wsc.Range("A2:A" & Wsc.Range("A" & Rows.Count).End(xlUp).Row)
          Set C = WsS.Columns("A").Find(Cel.Value, LookIn:=xlValues, lookat:=xlWhole)
          If Not C Is Nothing And C.Offset(0, 1) = Cel.Offset(0, 1) And C.Offset(0, 2) = Cel.Offset(0, 2) Then
          firstAddress = C.Address
          Do
          Cel.Offset(0, Cel.End(xlToRight).Column).Resize(, 4).Value = C.Offset(0, 3).Resize(, 4).Value
          Set C = WsS.Columns("A").FindNext(C)
          Loop While Not C Is Nothing And C.Address <> firstAddress
          End If
          Next Cel
          Wsc.Activate
          Set C = Nothing: Set Wsc = Nothing: Set WsS = Nothing
          Encore Merci bcp
          0
          1. Bon, je commence par le code commenté :

            Sub Trier()
            Dim WsS As Worksheet, Wsc As Worksheet
            Dim Cel As Range, C As Range
            Dim firstAddress As String
            Dim Decalage As Integer
            'la variable Wss représente la feuille source "Enfant"
            Set WsS = Worksheets("Enfant")
            'la variable WsC représente la feuille cible "Parents"
            Set Wsc = Worksheets("Parents")
            'Pour chaque nom dans la colonne A de la feuille "Parents"
            For Each Cel In Wsc.Range("A2:A" & Wsc.Range("A" & Rows.Count).End(xlUp).Row)
            'On recherche ce même nom dans la colonne A de la feuille "Enfant"
            Set C = WsS.Columns("A").Find(Cel.Value, LookIn:=xlValues, lookat:=xlWhole)
            'Si le nom est trouvé et que le prénom et l'age sont identiques à ceux de la feuille "Parents", alors ..
            If Not C Is Nothing And C.Offset(0, 1) = Cel.Offset(0, 1) And C.Offset(0, 2) = Cel.Offset(0, 2) Then
            'On mémorise l'emplacement du nom dans la feuille "Enfant" afin de ne pas boucler sur les mêmes emplacements.
            firstAddress = C.Address
            Do
            'On affecte la valeur des cellules de la plage D à G de la feuille "Enfant" _
            à la plage de 4 colonnes qui suit la dernière colonne renseignée dans la feuille "Parents"
            Cel.Offset(0, Cel.End(xlToRight).Column).Resize(, 4).Value = C.Offset(0, 3).Resize(, 4).Value
            'On poursuit la recherche
            Set C = WsS.Columns("A").FindNext(C)
            'On boucle tant que le même nom est trouvé et que l'emplacement est différent
            Loop While Not C Is Nothing And C.Address <> firstAddress
            End If
            Next Cel
            Wsc.Activate
            Set C = Nothing: Set Wsc = Nothing: Set WsS = Nothing
            End Sub

            Ensuite, quelques explications sur l'instruction suivante :
            If Not C Is Nothing And C.Offset(0, 1) = Cel.Offset(0, 1) And C.Offset(0, 2) = Cel.Offset(0, 2) Then

            Cel représente la cellule qui contient le nom dans la feuille "Parents"
            Cel.Offset(0, 1) représente la cellule décalée de 1 colonne par rapport à Cel, soit le prénom
            Cel.Offset(0, 2) représente la cellule décalée de 2 colonnes par rapport à Cel, soit l'age

            C représente la cellule qui contient le nom dans la feuille "Enfant"
            Les décalages suivent la règle évoquée précédemment.

            Enfin, quelques explications sur l'instruction suivante :
            Cel.Offset(0, Cel.End(xlToRight).Column).Resize(, 4).Value = C.Offset(0, 3).Resize(, 4).Value

            Dans la feuille "Enfant", on copie la valeur des 4 cellules décalées de 3 colonnes par rapport au nom, soit Enfant nom, Enfant Prénom, age enfant,sexe enfant.
            On affecte ces valeurs à la plage de 4 cellules qui suit la dernière colonne renseignée sur la même ligne que Cel.

            A+
            0
            1. Merci pour tous ces détails wow :)

              J'ai essayé de modifier un peu mon fichier et de personnaliser le code pour mieux comprendre mais ça ne fonctionne pas. J'ai fait plusieurs tests mais il y a un truc qui m'échappe...

              Vous trouverez ci-joint mon nouveau tableau et le code modifié. Qu'est ce qui ne marche pas ?

              Merci beaucoup

              https://www.cjoint.com/?0IywfkIcDUR
              0
              1. Yees
                J'ai réussi à comprendre les offset :).

                Dans certaines colonnes de mon fichier, il n'y a pas de lettre ( c'est vide ou certaines cellules sont remplis et d'autre vide) et puisque le code commence à remplir la première colonne vide en allant de la gauche vers la droite bah ça ne fonctionne plus.

                Est ce qu'il y a un moyen de lire le code de la droite vers la gauche en remplissant à partir d'une colonne en particulier ou à partir de la première colonne vide tt simplement?

                Merciii :)
                0
                1. Ouiii ça marche :) YES!!

                  Merci d'avoir pris de votre temps pour m'aider :) :) :)
                  0