Je souhaite transposer mes données dans Excel qui ressemblent actuellement à ceci:
et je veux que cela ressemble à ceci:
Vous voyez que le problème est que je dois non seulement transposer les colonnes avec des valeurs, mais aussi ajouter une ligne pour chaque année consécutive pour chaque indicateur et pour un pays donné. Avez-vous de l'aide?
3 Réponses :
Je ne sais pas si vous pouvez faire cela en fonction de vos images, en raison de la taille de vos données. Mais avec un peu de filtrage et de réorganisation, je pense que la formule de cellule TRANSPOSE (array) est ce que vous recherchez:
Voici ce que nous obtiendrons:
Entrez = TRANSPOSE ( dans la barre de formule
Fermez le ) pour la formule de la cellule
Appuyez sur Ctrl + Maj + Entrée
REMARQUE: La fonction TRANSPOSE accepte un tableau comme entrée (cela se fait avec Ctrl + Maj + Entrée code>).
Après avoir écrit ceci, cela ne semble plus si classique.
Sub ClassicalTranspose()
Const cVntSource As Variant = "Sheet1" ' Source Worksheet Name/Index
Const cVntTarget As Variant = "Sheet2" ' Target Worksheet Name/Index
Const cStrSource As String = "A1:H14" ' Source Range
Const cStrTarget As String = "A1" ' Target Cell Range
Const cInt1 As Integer = 1 ' First Repeat Column
Const cInt2 As Integer = 2 ' Last Repeat Column
Const cStr1 As String = "Year" ' First New Column Header
Const cStr2 As String = "Value" ' Second New Column Header
Dim vntRep As Variant ' Repeat Array
Dim vntUni As Variant ' Unique Array
Dim vntTgt As Variant ' Target Array
Dim intRep1 As Integer ' First Column of Repeat Range
Dim intRep2 As Integer ' Last Column of Repeat Range
Dim intUni1 As Integer ' First Column of Unique Range
Dim intUni2 As Integer ' Last Column of Unique Range
Dim lngFirst As Long ' First Row of Source Range
Dim lngLast As Long ' Last Row of Source Range
Dim i As Long ' Source Arrays Row Counter
Dim j As Integer ' Source Arrays Column Counter
Dim k As Long ' Target Array Row Counter
Dim l As Integer ' Unique Array Column Counter
' Paste Source Range into Source Arrays (Repeat and Unique Arrays).
With ThisWorkbook.Worksheets(cVntSource).Range(cStrSource)
intRep1 = .Column + cInt1 - 1
intRep2 = .Column + cInt2 - 1
intUni1 = .Column + cInt2
intUni2 = .Columns.Count + .Column - 1
lngFirst = .Row
lngLast = .Rows.Count + .Row - 1
With .Parent
vntRep = .Range(.Cells(lngFirst, intRep1), .Cells(lngLast, intRep2))
vntUni = .Range(.Cells(lngFirst, intUni1), .Cells(lngLast, intUni2))
End With
End With
' Resize Target Array.
ReDim vntTgt(1 To (UBound(vntUni) - 1) * UBound(vntUni, 2) + 1, _
1 To UBound(vntRep, 2) + 2)
' Write Repeat to Target Array
For j = 1 To UBound(vntRep, 2)
vntTgt(1, j) = vntRep(1, j)
Next
k = 1
For l = 1 To UBound(vntUni, 2)
For i = 2 To UBound(vntRep)
k = k + 1
For j = 1 To UBound(vntRep, 2)
vntTgt(k, j) = vntRep(i, j)
Next
Next
Next
' Write Unique to Target Array
vntTgt(1, 1 + UBound(vntRep, 2)) = cStr1
vntTgt(1, 1 + UBound(vntRep, 2) + 1) = cStr2
k = 1
For j = 1 To UBound(vntUni, 2)
For i = 2 To UBound(vntUni)
k = k + 1
vntTgt(k, 1 + UBound(vntRep, 2)) = vntUni(1, j)
vntTgt(k, 2 + UBound(vntRep, 2)) = vntUni(i, j)
Next
Next
' Paste Target Array into Target Range.
With ThisWorkbook.Worksheets(cVntTarget).Range(cStrTarget)
.Resize(UBound(vntTgt), UBound(vntTgt, 2)) = vntTgt
End With
End Sub
Merci beaucoup pour vos réponses. la meilleure réponse à ma question a été publiée par Scott Craner avec un lien vers une autre question déjà répondue.
La solution idéale pour mon scénario était d'utiliser Power Query (également connu sous le nom de modèle de données dans Excel à partir de 2016), car j'ai un très grand ensemble de données qui ne pourra pas être géré par des tableaux croisés dynamiques en raison de la leur contrainte de taille. J'ai utilisé unpivot dans la requête de puissance et cela a fonctionné comme un rêve!
Convertir la matrice en table à 3 colonnes ('reverse pivot', 'unpivot', 'aplatir', 'normalize')
voir la deuxième réponse à: stackoverflow.com/questions/20541905/...
Merci beaucoup, cela a aidé. J'ai utilisé Power Query en raison de la quantité de données.