Transposer des données

ossaif

XLDnaute Nouveau
Bonjour,

Merci de m’indiquer si je peux transposer à l’aide d’une formule générale mes données contenues dans le tableau ci-joint, colonne « Travaux ».
Je voudrais que ces données soient placées dans des colonnes séparées intitulées « Trav1 » ; « Trav2 » ; « Trav3 » ; « Trav4 » , etc … à chaque fois qu’il y a changement de code dans la colonne « Code » et ce quel que soit le nombre de données par code.

A+
 

Pièces jointes

  • Test2.xlsx
    38 KB · Affichages: 71
  • Test2.xlsx
    38 KB · Affichages: 74
  • Test2.xlsx
    38 KB · Affichages: 68

ossaif

XLDnaute Nouveau
Re : Transposer des données

Bonjour,


J'ai modifié mon tableau en précisant les deux situations:
- la situation initiale
- le format de tableau final que je désire avoir après transposition des données de la colonne "Travaux" en autant de nouvelles colonnes que d'occurrences.

A+
 

Pièces jointes

  • Test2.xlsx
    43.9 KB · Affichages: 55
  • Test2.xlsx
    43.9 KB · Affichages: 54
  • Test2.xlsx
    43.9 KB · Affichages: 56

ROGER2327

XLDnaute Barbatruc
Re : Transposer des données

Bonjour à tous


Un essai par formules dans le classeur joint...​


ROGER2327
#6027


Mercredi 18 Gidouille 139 (Visitation de Mère Ubu - fête Suprême Seconde)
14 Messidor An CCXX, 7,1915h - lavande
2012-W27-1T17:15:34Z
 

Pièces jointes

  • Copie de Test2.xlsx
    44.9 KB · Affichages: 81
  • Copie de Test2.xlsx
    44.9 KB · Affichages: 81
  • Copie de Test2.xlsx
    44.9 KB · Affichages: 86

ROGER2327

XLDnaute Barbatruc
Re : Transposer des données

Re...
Bonsoir,

C'est formidable. C'est exactement ce que je cherchais.
Merci à ROGER2327 qui a trouvé la solution et merci à tous pour votre aide efficace.
A+
Bel enthousiasme qui fait plaisir ! Mais n'hésitez pas à revenir voir cette discussion car il est très possible que d'autres vous proposent des formules différentes et plus simples.​



Bonne soirée.


ROGER2327
#6029


Mercredi 18 Gidouille 139 (Visitation de Mère Ubu - fête Suprême Seconde)
14 Messidor An CCXX, 8,6192h - lavande
2012-W27-1T20:41:10Z
 

MichD

XLDnaute Impliqué
Re : Transposer des données

Bonjour,


On peut faire aussi cela par macro. La liste de départ peut-être en désordre!


VB:
Sub test()
Dim Rg As Range, C As Range, T As Variant
Dim Trouve As Range, A As Long, Adr As String
Dim B As Long, D As Integer, X As Integer
Dim Sh As Worksheet

Application.ScreenUpdating = False

On Error Resume Next

'Ajout d'une feuille contenant le résultat
'---Suppression de la feuille Résultat si elle existe
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = True

'---Création de la feuille résultat
Set Sh = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sh.Name = "Résultat"

'---Détermine la plage source où se trouve le tableau à transposer
With Worksheets("Données")
    Set Rg = .Range("A3:A" & .Range("A65536").End(xlUp).Row)
End With

'---Création d'un objet "dictionary" contenant une liste unique
'    de chacun des items de la liste
Set dic = CreateObject("Scripting.Dictionary")

'Création de la liste
For Each C In Rg
    If Not dic.Exists(C.Value) Then
            dic.Add C.Value, C.Value
    End If
Next

'Copie les données du dictionary dans une variable Tableau
T = dic.items

'Tri par ordre croissant le contenu du tableau
Quick_Sort T, LBound(T), UBound(T)

'Copie dans la première colonne de la feuille Résultat la liste
'des items du tableau T
Sh.Range("A1").Resize(UBound(T) + 1) = Application.Transpose(T)

'Pour chaque élément du tableau
For A = LBound(T) To UBound(T)
    With Rg
        'recherche la location de la valeur dans la liste de la
        'feuille des données
        Set Trouve = .Find(What:=T(A), LookIn:=xlValues, _
                        LooKAt:=xlWhole, Searchdirection:=xlNext, _
                        MatchCase:=False)
        'Lorsque trouvé,
        If Not Trouve Is Nothing Then
            'Notation de l'adresse
            Adr = Trouve.Address
            'Boucle tant que toutes les données du tableau des données
            'n'ont pas été copiées vers la plage destination
            Do
                Trouve.Offset(, 1).Copy Sh.Range("B1").Offset(B, D)
                D = D + 1
                Set Trouve = .FindNext(Trouve)
            'sort de la boucle lorsque la recheche (Find) revient
            'à la première cellule trouvée
            Loop Until Trouve.Address = Adr
            B = B + 1: D = 0
        End If
    End With
Next

'met une bordure autant des cellules de la première colonne
'de la feuille destination
For X = 7 To 12
    With Sh.Range("A1").Resize(UBound(T) + 1).Borders(X)
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With
Next
'Ajuste la largeur des colonnes de la feuille Résultat
Sh.Range("A1").CurrentRegion.EntireColumn.AutoFit
Application.ScreenUpdating = True
End Sub


Sub Quick_Sort(ByRef SortArray As Variant, ByVal First As Long, ByVal Last As Long)
Dim Low As Long, High As Long
Dim Temp As Variant, List_Separator As Variant
Low = First
High = Last
List_Separator = SortArray((First + Last) / 2)
Do
    Do While (SortArray(Low) < List_Separator)
        Low = Low + 1
    Loop
    Do While (SortArray(High) > List_Separator)
        High = High - 1
    Loop
    If (Low <= High) Then
        Temp = SortArray(Low)
        SortArray(Low) = SortArray(High)
        SortArray(High) = Temp
        Low = Low + 1
        High = High - 1
    End If
Loop While (Low <= High)
If (First < High) Then Quick_Sort SortArray, First, High
If (Low < Last) Then Quick_Sort SortArray, Low, Last
End Sub
 

Pièces jointes

  • Transposé automatique.xlsm
    58 KB · Affichages: 47

ossaif

XLDnaute Nouveau
Re : Transposer des données

Bonjour,

Désolé de revenir sur le même sujet. C'est la solution fournie par ROGER que j'ai utilisée l'autre jour. Elle fonctionne sans problème tant que j'utilise la même feuille et je me limite à 2 colonnes dans mon tableau source. J'avoue que j'ai adapté cette solution à mon cas sans bien comprendre le sens de chaque formule employée.
Vous est-il possible d'ajouter quelques explications?

Merci d'avance

A+
 

MichD

XLDnaute Impliqué
Re : Transposer des données

Bonjour,

Ceci devrait être valide peu importe le nombre de colonnes

VB:
Sub test2()
Dim Rg As Range, C As Range, T As Variant
Dim Trouve As Range, A As Long, Adr As String
Dim B As Long, D As Integer, X As Integer
Dim Sh As Worksheet, Col As Integer

Application.ScreenUpdating = False

On Error Resume Next

'Ajout d'une feuille contenant le résultat
'---Suppression de la feuille Résultat si elle existe
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = True

'---Création de la feuille résultat
Set Sh = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sh.Name = "Résultat"

'---Détermine la plage source où se trouve le tableau à transposer
With Worksheets("Données")
    Set Rg = .Range("A3:A" & .Range("A65536").End(xlUp).Row)
End With

'---Création d'un objet "dictionary" contenant une liste unique
'    de chacun des items de la liste
Set dic = CreateObject("Scripting.Dictionary")

'Création de la liste
For Each C In Rg
    If Not dic.Exists(C.Value) Then
            dic.Add C.Value, C.Value
    End If
Next

'Copie les données du dictionary dans une variable Tableau
T = dic.items

'Tri par ordre croissant le contenu du tableau
Quick_Sort T, LBound(T), UBound(T)

'Copie dans la première colonne de la feuille Résultat la liste
'des items du tableau T
Sh.Range("A1").Resize(UBound(T) + 1) = Application.Transpose(T)

'Pour chaque élément du tableau
For A = LBound(T) To UBound(T)
    With Rg.Offset(-1, 0).Resize(Rg.Rows.Count + 1, 1)
        'recherche la location de la valeur dans la liste de la
        'feuille des données
        Set Trouve = .Find(What:=T(A), LookIn:=xlValues, _
                        LooKAt:=xlWhole, Searchdirection:=xlNext, _
                        MatchCase:=False)
        'Lorsque trouvé,
        If Not Trouve Is Nothing Then
            'Notation de l'adresse
            Adr = Trouve.Address
            'Boucle tant que toutes les données du tableau des données
            'n'ont pas été copiées vers la plage destination
            Do
                With Worksheets(Trouve.Parent.Name)
                   X = .Cells(Trouve.Row, .Cells.Columns.Count).End(xlToLeft).Column
                End With
                Col = X - Trouve.Column
                
                Trouve.Offset(, 1).Resize(1, Col).Copy Sh.Range("B1").Offset(B, D)
                D = D + Col
                Set Trouve = .FindNext(Trouve)
            'sort de la boucle lorsque la recheche (Find) revient
            'à la première cellule trouvée
            Loop Until Trouve.Address = Adr
            B = B + 1: D = 0
        End If
    End With
Next

'met une bordure autant des cellules de la première colonne
'de la feuille destination
For X = 7 To 12
    With Sh.Range("A1").Resize(UBound(T) + 1).Borders(X)
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With
Next
'Ajuste la largeur des colonnes de la feuille Résultat
Sh.Range("A1").CurrentRegion.EntireColumn.AutoFit
Application.ScreenUpdating = True
End Sub

'------------------------------------------------
Sub Quick_Sort(ByRef SortArray As Variant, ByVal First As Long, ByVal Last As Long)
Dim Low As Long, High As Long
Dim Temp As Variant, List_Separator As Variant
Low = First
High = Last
List_Separator = SortArray((First + Last) / 2)
Do
    Do While (SortArray(Low) < List_Separator)
        Low = Low + 1
    Loop
    Do While (SortArray(High) > List_Separator)
        High = High - 1
    Loop
    If (Low <= High) Then
        Temp = SortArray(Low)
        SortArray(Low) = SortArray(High)
        SortArray(High) = Temp
        Low = Low + 1
        High = High - 1
    End If
Loop While (Low <= High)
If (First < High) Then Quick_Sort SortArray, First, High
If (Low < Last) Then Quick_Sort SortArray, Low, Last
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 681
Messages
2 090 870
Membres
104 681
dernier inscrit
Gtcheumawe