Transposer colonne multiple vers lignes multiples
Bonjour à tous,
Je viens vers vous pour savoir s'il existait une solution permettant de renverser un tableau originellement construit en colonne, pour un transposage vers une structure en ligne. (fichier en pièce jointe).
Le tableau recense des "elements" par catégorie. Chaque "element" a 5 variables
Le tableau à la base donnait : la catégorie, l'élément dans cette catégorie, et les 5 variables selon cette structure
categ 1
element 1
var a
var b
var c
var d
var e
element 2
var a
var b
var c
var d
var e
le tableau peut comprendre 3+ catégories et plusieurs dizaines d'éléments par catégorie.
J'aimerais basculer sur cela :
categ 1 | element 1 | var a | var b | var c | var d | var e
categ 1 | element 2 | var a | var b | var c | var d | var e
categ 2 | element 1 | .....
Si une solution existe, je suis preneur.
Merci par avance pour les retours.
A titre indicatif, j'utilise déjà ce types de codes pour restructurer des tableaux colonnes vers lignes, je n'arrive juste pas à voir comment coder ce nouveau problème :
Pour transposer categ 1 avec element 1-2-3 etc... : crédits LouReed, Machin, Jean-Eric, Klin89,
Sub normaliser_()
Dim myAreas As Areas, myArea As Range, i As Long, n As Long, b()
'attention à la dimension
ReDim b(1 To 1000, 1 To 3)
With Sheets("Feuil1")
With .Range("c1", .Range("c" & Rows.Count).End(xlUp))
On Error Resume Next
Set myAreas = .SpecialCells(2, 1).Areas
On Error GoTo 0
If myAreas Is Nothing Then Exit Sub
For Each myArea In myAreas
For i = 1 To myArea.Rows.Count
n = n + 1
b(n, 1) = myArea.Cells(1)(0, 0)
b(n, 2) = myArea.Cells(i)(1, 0)
b(n, 3) = myArea.Cells(i)
Next
Next
Set myAreas = Nothing
With .Offset(, .Columns.Count + 1).Resize(n, UBound(b, 2))
.CurrentRegion.Cells.Clear
.Value = b
.Columns.ColumnWidth = 17
End With
End With
End With
End SubPour passer d'une matrice carré vers un listing en liste de correspondance , crédits : R@chid, h2so4,
Sub Transpose_fonction_arcs()
Call blank_space 'vient placer les 0 dans le tableau pour ensuite créer la table des liens fonctions_fonctions
Dim Tbl()
Dim I As Integer
'appel de la fonction
Tbl() = TransposeGrille(Range("U1:AH14"))
'inscrit à partir de C20. Attention, les titres ne sont pas inscrits (Item1 et Item2)
Range("U16").Resize(UBound(Tbl, 1), UBound(Tbl, 2)) = Tbl
End Sub
Function TransposeGrille(Plage As Range) As Variant() 'la fonction retourne un tableau
Dim Tbl()
Dim Cel As Range
Dim I As Long
Dim J As Long
For Each Cel In Plage.Columns(1).Cells
For I = 1 To Plage.Columns.Count - 1
If Cel.Offset(, I).Value <> 0 Then
J = J + 1
ReDim Preserve Tbl(1 To 2, 1 To J)
Tbl(1, J) = Cel.Value
Tbl(2, J) = Plage(1, 1 + I).Value
End If
Next I
Next Cel
TransposeGrille = Application.WorksheetFunction.Transpose(Tbl())
End FunctionMerci,
F.
Je vais m'auto-répondre avec ce thread...
Le problème est le même, la macro à ajuster cela dit.
A priori cette macro permet de répondre à la question, même si mon tableau initial n'a pas la même forme au départ.
La macro fait le travail de transposer des références + valeurs en ligne successives qui se répètent selon un schéma (toutes les 4 lignes), en colonne.
Pour ceux qui cherchait une solution, je fais remonter au cas où.
Merci à Jean-Eric.
G.
Bonjour Pwetzou, le forum
Sans conviction 8)
Option Explicit
Sub test()
Dim a, b(), i As Long, j As Long, n As Long, t As Byte, txt As String
With Sheets("Feuil1").Range("b3").CurrentRegion
a = .Value
ReDim b(1 To UBound(a, 1), 1 To 2)
n = 1
For i = 1 To UBound(a, 1)
If Left(a(i, 1), 5) = "categ" Then
txt = a(i, 1)
Else
If Left(a(i, 1), 7) = "element" Then
t = 2: n = n + 1
b(n, 1) = txt
b(n, 2) = a(i, 1)
Else
t = t + 1
If UBound(b, 2) < t Then
ReDim Preserve b(1 To UBound(b, 1), 1 To t)
End If
If n = 2 Then b(1, t) = a(i, 1)
b(n, t) = a(i, 2)
End If
End If
Next
With .Offset(, .Columns.Count + 1).Resize(n, UBound(b, 2))
.CurrentRegion.ClearContents
.Value = b
End With
End With
'Sheets("feuil2").Cells(1).Resize(n, UBound(b, 2)) = b
End SubAttention aux espaces invisibles notamment en B2
klin89