Appariement : mettre des lignes les unes à côté des autres

Fermé
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 - 30 oct. 2017 à 21:37
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 2 nov. 2017 à 22:55
Bonjour,



J'ai dans unfichier excel une base de données avec 1841 lignes qui correspondent à des données de personnes. Dans une colonne j'ai un numéro qui correspond à chaque personne. Je voudrais juxtaposer automatiquement certaines lignes avec d'autres. J'ai la liste de ces juxtapositions. Avez-vous un petit programme pour faire cela ?

Je mets ici un exemple pour bien comprendre ce que je cherche à faire :

https://www.cjoint.com/c/GJEuIsLEXrV

J'ai mis une partie de la base d edonnée
et en dessous les lignes (identifiées par des numéros) à mettre l'une à côté de l'autre

merci de votre aide




6 réponses

eriiic Messages postés 24494 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 29 janvier 2023 7 156
Modifié le 30 oct. 2017 à 22:12
Bonjour,

tu devrais ajouter une feuille avec le résultat attendu.
Parce là...
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
30 oct. 2017 à 22:20
Effectivement,

voici un fichier plus clair

premier feuillet, une base de donnée
deuxième feuillet la requête (lignes à juxtaposer)
troisième feuillet le résultat attendu

Merci de votre aide
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
30 oct. 2017 à 23:20
excusez-moi...
Voici le fichier:

https://www.cjoint.com/c/GJEvtG1uuEV
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
30 oct. 2017 à 23:13
Bonjour,

voici un fichier plus clair surtout absent !

Alors avec ce que j'ai compris, regardes si cette macro correspond à ton attente.
Public Sub apparients()
Dim lig As Long, col As Integer
Dim cel As Range, pos As Range, Tba
Tba = Range("a29:c31").Value     ' plage  des apparients
For lig = 1 To UBound(Tba)
    Set pos = Cells.Find(Tba(lig, 1))
    If Not pos Is Nothing Then
        For col = UBound(Tba, 2) To 2 Step -1
            Set cel = Cells.Find(Tba(lig, col))
            If Not cel Is Nothing Then
                Rows(pos.Row + 1).Insert
                Rows(cel.Row).Cut Destination:=Rows(pos.Row + 1)
                Rows(pos.Row + 1).Interior.Pattern = xlGray16
            End If
        Next col
    End If
Next lig
End Sub

tu adaptes la plage des apparients à ton classeur.
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
30 oct. 2017 à 23:27
excuses moi mais je suis un peu nul et je ne sais pas faire fonctionner la macro avec mon fichier.
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
31 oct. 2017 à 09:07
Bonjour,

Dans ton classeur tu actives la feuille concernée,
tu ouvres l'éditeur VBA (alt+F11)
Menu insertion / module
Tu copies la macro et tu la colles dans le module
tu modifies ta plage des apparients avec l'adresse concernée dans ton classeur
avec ta sélection dans la macro tu utilises la touche F5
et tu regardes le résultat.
S'il ne te convient pas tu ne sauvegarde pas.

Voilà ton classeur exemple : https://www.cjoint.com/c/GJFig5eYnil
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1 > gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020
31 oct. 2017 à 22:43
Ce qui est fait correspond à ce que je veux saufune chose: je voudrais avoir les lignes appariés sur la même ligne que la première. Dans l'exemple : la ligne 2 et la ligne 3 sur la même ligne que la ligne 1; la ligne 6 et la ligne 7 après la ligne 5...

Merci de ton aide.
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
1 nov. 2017 à 08:51
Bonjour,

je voudrais avoir les lignes appariés sur la même ligne que la première.
Je voudrais juxtaposer automatiquement certaines lignes avec d'autres.

Si l'on rapproche tes demandes tu avoueras que leur formulation n'est point du même ordre. ;-)

Voilà ta macro modifiée et son classeur test
Public Sub apparients()
Dim lig As Long, col As Integer, mxc As Integer, pcl As Integer
Dim cel As Range, pos As Range, Tba
Tba = Range("a29:c31").Value     ' plage  des apparients
mxc = ActiveSheet.UsedRange.Columns.Count
For lig = 1 To UBound(Tba)
    Set pos = Cells.Find(Tba(lig, 1))
    If Not pos Is Nothing Then
        pcl = 1
        For col = 2 To UBound(Tba, 2)
            Set cel = Cells.Find(Tba(lig, col))
            If Not cel Is Nothing Then
                pcl = pcl + mxc
                Cells(cel.Row, 1).Resize(1, mxc).Cut Destination:=Cells(pos.Row, pcl)
            End If
        Next col
    End If
Next lig
End Sub

https://www.cjoint.com/c/GKbhYhfnwMl
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
Modifié le 1 nov. 2017 à 11:02
D'abord 1000 excuses de ne pas être clair.

J'ai essayé mais pour le moment je n'y arrive pas. Il doit y avoir un truc que je ne comprends pas .

Dans le fichier ci dessous j'ai mis une base de donnée allégée de celle que j'ai (quelques colonnes seulement)

https://www.cjoint.com/c/GKbj718X1ZV

En bas j'ai mis les 3 colonnes correspondants à ce qu'il faut apparier.

Quand je fais tourner la macro en ayant mien bien la plage a1862:c101413 je ne comprends pas ce qui est fait
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
2 nov. 2017 à 00:40
j'ai corrigé mon erreur pour la base allégée (c'est évidemment dans la "plage des appariés")

Mais le problème persisite dans ma base complète. Il y a plusieurs lignes ou les données de la première personne disparaissent.
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
2 nov. 2017 à 09:39
Bonjour,

Il y a plusieurs lignes ou les données de la première personne disparaissent.
Comme la macro ne supprime aucune donnée il ne peut y avoir de disparition !
Par contre "les données de la première personne que tu ne vois plus sont sans doute appariées sur une autre ligne.

c'est évidemment dans la "plage des appariés", comme tu dis qu'il se trouve des incohérences.
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1 > gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020
2 nov. 2017 à 12:06
Effectivement la ligne effacée se retrouve à côté d'une autre comme une appariée. Mais la ou c'est mais ne correspond pas à ce qui est dans les 3 colonnes de requêtes. C'est pour cela que je ne comprends pas.
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
2 nov. 2017 à 22:06
Bonsoir,

Tu peux essayer cette nouvelle version qui te permettra de voir le souci j'espère
Public Sub apparients()
Dim lig As Long, lgs As Long, col As Integer, mxc As Integer, pcl As Integer
Dim cel As Range, pos As Range, Tba
Tba = Range("Feuil1!A29:C31").Value     ' plage  des apparients
mxc = ActiveSheet.UsedRange.Columns.Count
For lig = 1 To UBound(Tba)
    Set pos = Columns(1).Find(Tba(lig, 1))
    If Not pos Is Nothing Then
        pcl = 1
        For col = 2 To UBound(Tba, 2)
            Set cel = Columns(1).Find(Tba(lig, col), [A1])
            If Not cel Is Nothing Then
                pcl = pcl + mxc: lgs = cel.Row
                Cells(cel.Row, 1).Resize(1, mxc).Cut Destination:=Cells(pos.Row, pcl)
                Cells(lgs, 1) = Tba(lig, col)
            End If
        Next col
    End If
Next lig
End Sub
0
borisparis Messages postés 79 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 6 janvier 2023 1
2 nov. 2017 à 22:22
Cette fois-çi ca fonctionne parfaitement !
je ne sais pas la différence mais ca marche !
0
gbinforme Messages postés 14939 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 647
2 nov. 2017 à 22:55
C'est tant mieux que cela fonctionne : le positionnement ne se faisait sans doute pas correctement.
Bonne utilisation !
0