Comparer plusieurs listes / classements

Bonjour à tous,

Je ne suis pas un pro d'Excel, et ce n'est pas un hasard si je viens chercher de l'aide ici

Voilà ce que j'ai à la base :

Plusieurs classements de données répartis sur 5 colonnes (c'est variable). Pour simplifier les choses, on va dire que ce sont des prénoms. J'ai donc au départ un tableau qui ressemble au fichier attaché ci-dessous avec plusieurs listes de prénoms (uniques) :

Particularité de ce tableau, chaque classement/colonne fait 500 lignes. Par ailleurs, il est tout à fait possible que des prénoms présent sur une colonne soient absent dans une autre colonne : cela s'explique par le fait que je limite le nombre de ligne à 500 et que dans la réalité "john" qui est classé 63ème en colonne B peut être 604ème en colonne C.

Mon objectif

En supposant que ces différents classements/colonnes soient les 500 premiers coureurs de plusieurs marathons, l'idée est de dresser un tableau qui afficherait les fluctuations de chaque joueur.

Ce qui donnerait un tableau comme :

23tableau-final.xlsx (8.88 Ko)

Attention : si je fais ici une analogie avec le sport, il n'en est rien pour les données que je souhaite traiter. Donc il n'est pas question de points, ou de pondération.

J'ai déjà fait des demandes sur d'autres forums

Autant le dire de suite, j'ai déjà posté mon problème par ailleurs. Par exemple, sur le site anglo-saxon Mrexcel quelqu'un m'a proposé une solution en VBA qui fonctionne sur des tableaux avec peu de données, mais avec 500 par colonne, j'ai de suite un message d'erreur "L'indice n'appartient pas à la sélection" sans possibilité de debug.

D'avance merci et bravo à celui (ou celle) qui me trouvera la solution

Aurélien

salut!

J'ai bien compris le problème, cependant je n'ai pas de PC sous la main pour tester ma réponse mais as-tu essayé de transposer tn tableau et de faire un tableau croisé dynamique pour synthétiser tes données?

Bonsoir et bienvenue

Regarde si ça te convient

Amicalement

Nad

Nad, merci pour ta proposition. J'avoue que c'est pas mal comme formule, mais je ne vois pas du tout comment l'appliquer "rapidement" sur les listes de 500 entrées. Comment fais-tu par exemple pour dresser la liste de tous les prénoms (colonne "prénoms") ?

Bonjour

Je pensais que la liste "Prénoms" était déjà prête.

Il faut donc passer par VBA

Dans le fichier que j'ai joint, fais un copié-collé de ce code dans la feuille TABLO (click droit sur le nom de l'onglet ==> Visualiser le code)

Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim Dercol As Integer, i As Integer, j As Integer
Dim data
Dim tablo

Dercol = Sheets("Feuil1").Range("A1").SpecialCells(xlCellTypeLastCell).Column

Range("A2:A501").ClearContents

    For i = 2 To Dercol
    Ligne = Range("A65536").End(xlUp).Row + 1
    With Sheets("Feuil1")
       .Range(.Cells(2, i), .Cells(501, i)).Copy Range("A" & Ligne)
    End With
    Next i

Set data = CreateObject("Scripting.Dictionary")
tablo = Sheets("TABLO").Range("A2:A" & Range("A65536").End(xlUp).Row)

    For j = 1 To UBound(tablo)
        data.Item(tablo(j, 1)) = data.Item(tablo(j, 1))
    Next j

Range("A2:A" & Range("A65536").End(xlUp).Row).ClearContents
Range("A2", Cells(data.Count + 1, "A")) = Application.Transpose(data.keys)
Range("A502:Z65536").ClearContents
Range(Cells(2, 2), Cells(501, Dercol)).FormulaR1C1 = _
        "=IFERROR(INDEX(Feuil1!R1C1:R501C1,MATCH(RC1,Feuil1!R1C:R501C,0)),"""")"
Range(Cells(2, 2), Cells(501, Dercol)) = Range(Cells(2, 2), Cells(501, Dercol)).Value

End Sub

Sélectionne feuil1 puis reviens sur la feuille TABLO

Chaque fois que la feuille TABLO sera sélectionnée, le code sera lancé

Amicalement

Nad

Merci Nad, ça marche nickel !

Zut, Nad, je viens de déceler un problème dans ton VBA :

Pour recréer la liste des prénoms, tu utilises la première liste (liste 1) dans Feuil1. Or la liste que tu obtiens n'est pas exhaustive car elle ne prends pas en compte les autres prénoms susceptibles d’apparaître dans liste 2, liste 3 etc et qui ne serait pas dans liste 1.

Autrement dit si chacune de mes liste de départ font 500 lignes, au final la liste des prénoms devrait tourner autour des 600, mais ce chiffre lui est forcément variable. Tu vois ce que je veux dire ?

Merci en tout cas pour ton aide, je ne suis jamais allé aussi loin sur les autres forums

Aurélien74 a écrit :

Pour recréer la liste des prénoms, tu utilises la première liste (liste 1) dans Feuil1. Or la liste que tu obtiens n'est pas exhaustive car elle ne prends pas en compte les autres prénoms susceptibles d’apparaître dans liste 2, liste 3 etc et qui ne serait pas dans liste 1.)

Faux - Toutes les colonnes sont prises en compte.

Le problème que tu rencontres est que le code ne gardait que 500 noms.

Nouveau code

Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim Dercol As Integer, i As Integer, j As Integer, Ligne As Integer
Dim data
Dim tablo

Dercol = Sheets("Feuil1").Range("A1").SpecialCells(xlCellTypeLastCell).Column

Range("A2:A65536").ClearContents

    For i = 2 To Dercol
    Ligne = Range("A65536").End(xlUp).Row + 1
        With Sheets("Feuil1")
           .Range(.Cells(2, i), .Cells(501, i)).Copy Range("A" & Ligne)
        End With
    Next i

Set data = CreateObject("Scripting.Dictionary")
tablo = Sheets("TABLO").Range("A2:A" & Range("A65536").End(xlUp).Row)

    For j = 1 To UBound(tablo)
        data.Item(tablo(j, 1)) = data.Item(tablo(j, 1))
    Next j

Range("A2:A" & Range("A65536").End(xlUp).Row).ClearContents
Range("A2", Cells(data.Count + 1, "A")) = Application.Transpose(data.keys)

Ligne = Range("A65536").End(xlUp).Row
Range(Cells(2, 2), Cells(Ligne, Dercol)).FormulaR1C1 = _
            "=IFERROR(INDEX(Feuil1!R1C1:R501C1,MATCH(RC1,Feuil1!R1C:R501C,0)),"""")"
Range(Cells(2, 2), Cells(Ligne, Dercol)) = Range(Cells(2, 2), Cells(Ligne, Dercol)).Value

End Sub

Nad

Super ! fanx

Rechercher des sujets similaires à "comparer listes classements"