VBA Copier des lignes avec plusieurs conditions [Résolu/Fermé]

Signaler
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
-
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
-
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

Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
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+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

Bonjour, Merci d'avoir répondu :). Comment on fait pour poster un fichier exemple?? Je n'arrive pas à joindre mon fichier excel.
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

Merci pour le lien.

Voici mon fichier: https://www.cjoint.com/?0Iyo4wkaBjh
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
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+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

Le seul hic c'est que dans l'onglet parents, il faut que toutes les infos soient sur la même ligne...

Ci-joint un exemple.

Merci bcp


https://www.cjoint.com/?0Iyp5W6UpWj
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
J'ai encore lu en diagonale :D

Alors une nouvelle proposition avec VBA
https://www.cjoint.com/?DIyraJidQIf

A+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

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
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
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+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

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
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
Nouvelle version à tester

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

A+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

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 :)
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
496
Bonjour,

Bon, alors une nouvelle, nouvelle version :D
https://www.cjoint.com/?DICkKAEoZ9s

A+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014

Ouiii ça marche :) YES!!

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