Transposer une colonne en lignes

Bonjour,

Plutôt que de grands discours je vous propose de regarder l'exemple ce que je cherche à faire en macro VBA dans le fichier Excel joint :

  • onglet données: c'est un tableau avec des num_client qui se répètent en fonction de la variable critère.
  • onglet résultat attendu : un num client unique avec les informations en colonne ( peu importe le nom des colonnes. Dans l'ex, j'ai mis NB_POMMES, NB_POIRES .... peu importe l'intitulé des colonnes, juste qu'elle mentionne la modalité FRUIT concerné.
La difficulté est que les modalités de la variable CRITERE peuvent être différentes d'un client à un autre.

Toutefois, la liste des modalites est connue. Il y a 4 valeurs possibles : POMMES, POIRES, CITRONS, FRAISES.

Si quelqu'un peut m'aider, merci merci d'avance.

Cordialement, V.NEVEU

59transposer.xlsx (8.85 Ko)

Bonsoir,

Pourquoi ne pas utiliser les tableaux croisés dynamiques ?

37transposer.xlsx (12.76 Ko)

Bonjour neveu, toutes et tous,

Bonjour oyobrans,

Voir si cela convient en feuille "Résultat A produire".

Cordialement.

67transposer-v1.xlsx (13.46 Ko)

Bonjour,

Le tableau croisé dynamique ne génère que les modalités qui existent.

Je veux en sortie toutes les modalités de la variable CRITERE du fichier excel, qu'elles soient présentes ou pas dans ma base initiale.

Merci.


Bonjour mdo100,

Et comment produisez vous le tableau transposé?

Merci. V

Bonsoir le forum,

A tester :

Attention aux espaces superflus dans la colonne 2 du tableau source.

Option Explicit

Sub test()
Dim a, b(), i As Long, n As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    a = Sheets("Feuil1").Range("a1").CurrentRegion.Value
    ReDim b(1 To UBound(a, 1), 1 To 5)
    n = 1: b(1, 1) = a(1, 1)
    b(1, 2) = "NB_" & "POMMES": b(1, 3) = "NB_" & "POIRES"
    b(1, 4) = "NB_" & "CITRONS": b(1, 5) = "NB_" & "FRAISES"
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        .Item("POMMES") = 2: .Item("POIRES") = 3
        .Item("CITRONS") = 4: .Item("FRAISES") = 5
        For i = 2 To UBound(a, 1)
            If Not dico.exists(a(i, 1)) Then
                n = n + 1: dico(a(i, 1)) = n
                b(n, 1) = a(i, 1)
            End If
            b(dico(a(i, 1)), .Item(a(i, 2))) = a(i, 3)
        Next
    End With
    Application.ScreenUpdating = False
    'restitution et mise en forme
    With Sheets(3)
        .Cells.Clear
        With .Cells(1).Resize(n, 5)
            .Value = b
            .Font.Name = "calibri"
            .Font.Size = 10
            .VerticalAlignment = xlCenter
            .HorizontalAlignment = xlCenter
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            With .Rows(1)
                .BorderAround Weight:=xlThin
                With .Offset(, 1).Resize(, .Columns.Count - 1)
                    .Interior.ColorIndex = 36
                    .Font.Bold = True
                End With
            End With
            With .Columns(1)
                With .Offset(1).Resize(.Rows.Count - 1)
                    .Interior.ColorIndex = 38
                End With
            End With
            .Columns.ColumnWidth = 12
        End With
        .Activate
    End With
    Application.ScreenUpdating = True
End Sub

klin89

Bonjour klin89,

j'ai testé le code mais j'ai ce message d'erreur:

'erreur d exécution 9

l'indice n apparait pas dans la sélection

Pouvez vous m'aider? J'ai joint le fichier avec la macro enregistrée.

Que signifie Ubound?

Merci beaucoup.

VN

47transposer-v1.xlsm (19.54 Ko)

Bonsoir neveu,

Visiblement, vous ne tenez pas compte de mes remarques 8)

Attention aux espaces superflus dans la colonne 2 du tableau source

De plus, faites attention au nom de la feuille de restitution, ici il s'agit de la feuille classée en 3ème position dans votre classeur.

Dans votre dernier fichier joint, votre feuille source est la 3ème

'restitution et mise en forme
   With Sheets(3)

klin89

Merci klin89, cela marche parfaitement.

Rechercher des sujets similaires à "transposer colonne lignes"