VBA Copier des lignes avec plusieurs conditions

Résolu
faeyna Messages postés 8 Statut Membre -  
faeyna Messages postés 8 Statut Membre -
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. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  2. faeyna Messages postés 8 Statut Membre
     
    Bonjour, Merci d'avoir répondu :). Comment on fait pour poster un fichier exemple?? Je n'arrive pas à joindre mon fichier excel.
    0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  5. faeyna Messages postés 8 Statut Membre
     
    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
  6. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  7. faeyna Messages postés 8 Statut Membre
     
    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
  8. faeyna Messages postés 8 Statut Membre
     
    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
  9. faeyna Messages postés 8 Statut Membre
     
    Ouiii ça marche :) YES!!

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