Trier

Bonjour à tous !

Pour faire un exposé j'ai besoin d'avoir un tableau Excel trié par Pays/Date, sauf que j'ai actuellement 3 colonnes : Pays, Date et Valeur

Le problème c'est que j'ai une ligne par pays et par date pour une valeur.

J'aimerais transformer mon tableau excel pour avoir tout les pays une seule fois dans la colonne A, et toutes les dates une seule fois sur la ligne n°1 et que toutes les valeurs corespondent au pays et à la date en question. Et j'aimerais savoir si il y'a un moyen "automatique" de le faire car je dois le faire sur plusieurs tableaux.

Merci beaucoup pour votre aide !

Bonjour, et welcome !

tu peux le faire avec un TCD (tableau croisé dynamique)

en plus tu peux "jouer" avec la mise en ligne, colonne et avec les valeurs (mini, moyenne, somme, maxi) pour avoir le résultat que tu souhaites

7co2-emmissions.xlsx (110.05 Ko)

BOnjour,

Une autre piste par macro, hello Steelson , avec une feuille ajoutée nommée "Données triées" :

Sub Test()

    Dim Fe As Worksheet
    Dim Dico As Object
    Dim Cle As Variant
    Dim Plage As Range
    Dim Cel As Range
    Dim T As Variant
    Dim Annee As Integer
    Dim I As Integer
    Dim J As Integer

    Set Dico = CreateObject("Scripting.Dictionary")

    'plage des dates
    With Worksheets("SYB60_T25_Carbon Dioxide Emissi"): Set Plage = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'ajoute une feuille nommée "Données triées" si elle n'existe pas déjà
    On Error Resume Next
    Set Fe = Worksheets("Données triées")
    If Fe Is Nothing Then Set Fe = Worksheets.Add
    On Error GoTo 0

    Fe.Name = "Données triées"

    'récupère les dates uniques...
    For Each Cel In Plage: Dico(Cel.Value) = "": Next Cel

    '...et les inscrit en première ligne
    For Each Cle In Dico.Keys: I = I + 1: Fe.Cells(1, I + 1).Value = Cle: Next Cle

    Dico.RemoveAll

    'plage des noms de pays
    With Worksheets("SYB60_T25_Carbon Dioxide Emissi"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    'stocke dans le dictionnaire les noms des pays et couple l'année avec la valeur (séparé par un tiret bas) el les ensembles séparés par une virgule
    For Each Cel In Plage: Dico(Cel.Value) = Dico(Cel.Value) & Cel.Offset(, 1).Value & "_" & Cel.Offset(, 2).Value & ",": Next Cel

    I = 0

    'défini la plage sur la ligne 1 pour la recherche des dates
    With Fe: Set Plage = .Range(.Cells(1, 2), .Cells(1, .Columns.Count).End(xlToLeft)): End With

    For Each Cle In Dico.Keys

        'inscrit le nom du pays
        I = I + 1: Fe.Cells(I + 1, 1).Value = Cle

        'extrait les ensembles...
        T = Split(Dico(Cle), ",")

        '...et boucle
        For J = 0 To UBound(T) - 1

            'extrait l'année de l'ensemble
            Annee = Split(T(J), "_")(0)

            'la recherche dans la plage
            Set Cel = Plage.Find(Annee, , xlValues, xlWhole)

            'et si trouvée, inscrit la valeur
            If Not Cel Is Nothing Then Fe.Cells(I + 1, Cel.Column).Value = Split(T(J), "_")(1)

        Next J

    Next Cle

End Sub

Bonsoir à tous,

Voici une autre idée

cdt

Henri

Merci beaucoup ! Le tableau croisé dynamique correspond parfaitement à ce que je cherchais !

Bonjour à tous,

Pour le fun, voici ma solution après avoir modifié le nombre de lignes par pays à 8.

Cdt

Henri

Rechercher des sujets similaires à "trier"