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

Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
- - Dernière réponse : faeyna
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
- 29 sept. 2014 à 22:12
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.
Afficher la suite 

14 réponses

Messages postés
3341
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
450
0
Merci
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
0
Merci
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
3341
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
450
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
0
Merci
Merci pour le lien.

Voici mon fichier: http://cjoint.com/?0Iyo4wkaBjh
Messages postés
3341
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
450
0
Merci
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

http://cjoint.com/?DIypt1VKhRt

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


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

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

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


http://cjoint.com/?0IywfkIcDUR
Messages postés
3341
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
450
0
Merci
Nouvelle version à tester

http://cjoint.com/?DIyxr4d1j5z

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

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

A+
Messages postés
8
Date d'inscription
mardi 23 septembre 2014
Statut
Membre
Dernière intervention
29 septembre 2014
0
Merci
Ouiii ça marche :) YES!!

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