Transposer un champ présent sur plusieurs lignes en colonnes distinctes

Bonjour à toutes et tous !

Je suis confronté à un problème de présentation de données avec Excel. Dans un tableau, des enregistrements se répètent
(plusieurs lignes), en fonction de valeurs différentes présentent dans la colonne C. Pour chacune de ces valeurs différentes,
je souhaiterais pouvoir créer des colonnes distinctes afin de n'avoir plus qu'une seule ligne, en fonction des valeurs
contenues dans les colonnes A et B.

Difficile à expliquer sous forme de texte; pour comprendre mon besoin, le mieux est certainement de consulter le fichier
d'exemple ci-joint, cela me semble plus compréhensible.

Les essais menés jusqu'à présent avec Power Query (avec lequel je débute) ne m'ont pas permis de régler le problème.

Je serais très reconnaissant d'obtenir de l'aide en la matière !

39ressources.xlsx (11.24 Ko)

Bonjour,

Avec Power Query, et en utilisant ce code (à insérer dans l'éditeur PQ) :

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    GroupBy = Table.SplitColumn(Table.Group(Source, {"Numéro", "Activité"}, {{"Ressource", each Text.Combine([Ressource],"\")}}), "Ressource", Splitter.SplitTextByDelimiter("\", QuoteStyle.Csv))
in
    GroupBy

Bonne journée

Bonjour à tous !

Une autre approche Power Query :

@cousinhub : Je crains que votre requête ne soit pas dynamique. Faire un test en ajoutant 3 lignes en Numéro 500 et Activités = "Nettoyages"

Hello,

@cousinhub : Je crains que votre requête ne soit pas dynamique. Faire un test en ajoutant 3 lignes en Numéro 500 et Activités = "Nettoyages"

Effectivement...

Il semblerait que la fonction "Splitter" se limite à 4 "Fractions" si on ne spécifie pas le nombre (et les noms .1, .2...), nombre qu'on ne peut connaître à l'avance...

Je vais abandonner l'idée, merci pour cette remarque

Bonne journée

Bonjour à tous de nouveau !

@cousinhub : "Abandonner l'idée" ? Non non.......

Pour éviter ce piège, il est nécessaire de calculer ce fameux nombre maximum.
Dans l'esprit de votre requête, je propose :

let
    Source = Excel.CurrentWorkbook(){[Name="t_Initial"]}[Content],
    Fractt = Table.SplitColumn(
                                Table.Group(
                                            Source,
                                            {"Numéro", "Activité"},
                                            {{"Ressource", each Text.Combine([Ressource],"\")}}
                                        ),
                                "Ressource",
                                Splitter.SplitTextByDelimiter("\", QuoteStyle.Csv),
                                // Détermination du nombre max :
                                List.Max(Table.Group(Source, {"Numéro", "Activité"}, {{"Nombre", each Table.RowCount(_)}})[Nombre])
                              )

in
    Fractt

Il serait également envisageable de n'opérer qu'un seul regroupement. Le prix à payer étant un nombre plus élevé d'étapes.

Re-,

Nickel, merci beaucoup (et désolé Denis si j'ai un peu "squatté" ton fil...)

Bonne apm

Bnsoir à tous,

Version VBA

Option Explicit
Sub pivoter()
    Dim a, w(), i As Long, j As Long, n As Long, col As Byte, txt As String, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = 1
    a = Sheets("feuil1").Range("A1").CurrentRegion.Value
    col = UBound(a, 2): n = 1: a(n, 3) = "Ressource_1"
    For i = 2 To UBound(a, 1)
        txt = Join(Array(a(i, 1), a(i, 2)), Chr(2))
        If Not dico.exists(txt) Then
            n = n + 1: dico(txt) = VBA.Array(n, col)
            For j = 1 To col
                a(n, j) = a(i, j)
            Next
        Else
            w = dico(txt): w(1) = w(1) + 1
            If UBound(a, 2) < w(1) Then
                ReDim Preserve a(1 To UBound(a, 1), 1 To w(1))
            End If
            a(w(0), w(1)) = a(i, 3)
            dico(txt) = w
        End If
    Next
    Application.ScreenUpdating = False
    With Sheets.Add().Cells(1).Resize(n, UBound(a, 2))
        .Value = a
        If UBound(a, 2) > col Then
            With .Offset(, 2).Resize(1, 1)
                .AutoFill .Resize(, UBound(a, 2) - 2)
            End With
        End If
        .Font.Name = "calibri"
        .Font.Size = 10
        .VerticalAlignment = xlCenter
        .Borders(xlInsideVertical).Weight = xlThin
        .BorderAround Weight:=xlThin
        With .Rows(1)
            .Font.Size = 11
            .BorderAround Weight:=xlThin
            .Interior.ColorIndex = 43
        End With
        .Columns.ColumnWidth = 16
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

Merci les amis pour vos précieuses contributions! Je suis content de voir que des solutions à ma demande existent,
c'est très intéressant et cela m'ouvre de belles perspectives pour d'autres tâches.

Il ne me reste plus qu'à tester les solutions proposées, essayer de comprendre la logique pour pouvoir la
reproduire et la réutiliser dans d'autres contextes.

Amicalement !

Rechercher des sujets similaires à "transposer champ present lignes colonnes distinctes"