Matrice VBA pour convertir des colonnes en lignes
Bonjour,
Je travaille aujourd'hui sur un fichier et je trouve que c'est très très fastidieux
Ci-joint un exemple avec le même format que le fichier d'origine.
Le fichier contient trois onglets: l'onglet des données à traiter et l'onglet du résultat qu'on veut obtenir. Je le fais pour deux colonnes
Je cherche une macro qui me donne le résultat (onglet résultat du fichier) à partir du tableau de l'onglet (Données) du fichier. Il sera très semblable à celui fourni par notre sauveteur Klin89 dans le sujet :
https://forum.excel-pratique.com/viewtopic.php?f=2&t=120437&p=734344#p734344
Pour arriver aux résultat voulu il faut tout d'abord: insérer trois colonnes vides qui deviendront : colonne F, G et H.. La F au départ deviendra donc la colonne I et G deviendra J et ainsi de suite.
Ensuite, il faut faire une boucle pour :
1- copier la rangée (A3, E19) et la coller en dessous d'elle-même (n-1) fois où n est le nombre de colonne (à partir de la colonne I jusqu’à la fin.
2- couper le code Site 1 (contenu de la cellule I1 (auparavant F1) et coller le sur la colonne F dans les lignes de 3 à 19 (rangée (I3, I19)) et faire la même chose pour le code site 2,3,…etc
- couper le nom du centre (contenu de la cellule I2 (auparavant F2) et coller le sur la colonne G dans les lignes de 3 à 19 (rangée (G3, G19)) et faire la même chose pour le nom du centre 2, 3,…etc
- récupérer les valeurs numériques pour chaque centre et les coller dans la colonne H, rangée (H3, H19) pour centre 1, rangée (H20, H36) pour centre 2, et ainsi de suite jusqu’à la dernière colonne.
https://forum.excel-pratique.com/viewtopic.php?f=2&t=120437&p=734344#p734344
Merci de m'aider car sans macro je resterai une semaine ou 2 avec mon fichier
Bonsoir kasper2004
Essaie ceci :
Option Explicit
Sub test()
Dim a, b(), i As Long, j As Long, n As Long
a = Sheets("Données").Range("a1").CurrentRegion.Value2
ReDim b(1 To ((UBound(a, 1) - 2) * (UBound(a, 2) - 5)) + 1, 1 To 8)
n = 1
b(n, 1) = a(2, 1): b(n, 2) = a(2, 2): b(n, 3) = a(2, 3)
b(n, 4) = a(2, 4): b(n, 5) = a(2, 5): b(n, 6) = "N° Site"
b(n, 7) = "Nom Site": b(n, 8) = "Ventes"
For j = 6 To UBound(a, 2)
For i = 3 To UBound(a, 1)
n = n + 1
b(n, 1) = a(i, 1): b(n, 2) = a(i, 2)
b(n, 3) = a(i, 3): b(n, 4) = a(i, 4)
b(n, 5) = a(i, 5)
b(n, 6) = a(1, j): b(n, 7) = a(2, j)
b(n, 8) = a(i, j)
Next
Next
Application.ScreenUpdating = False
On Error Resume Next
Application.DisplayAlerts = False
Sheets("restitution").Delete
Sheets.Add().Name = "restitution"
On Error GoTo 0
With Sheets("restitution").Range("a1")
With .Resize(UBound(b, 1), UBound(b, 2))
.Value = b
.Font.Name = "calibri"
.Font.Size = 10
.BorderAround Weight:=xlThin
.Borders(xlInsideVertical).Weight = xlThin
.VerticalAlignment = xlCenter
With .Rows(1)
.BorderAround Weight:=xlThin
.Interior.ColorIndex = 43
.HorizontalAlignment = xlCenter
End With
.Columns.AutoFit
.Columns(4).NumberFormat = "yyyy/mm/dd;@"
.Columns(5).NumberFormat = "yyyy/mm/dd;@"
.Columns(8).NumberFormat = _
"_-* #,##0.00 [$€-40C]_-;-* #,##0.00 [$€-40C]_-;_-* ""-""?? [$€-40C]_-;_-@_-"
End With
End With
Application.ScreenUpdating = True
End Sub
klin89
Bonjour Klin89
je savais que tu vas me répondre.
merci infiniment. je vais le tester sur mon fichier et je reviens vers toi.
merciiiiiiiiiiii
bonjour
salut au passage Klin
sans VBA,
ajoutons une ligne dans les données, qui crée une véritable ligne d'ent-têtes
ensuite "mettre sous forme de tableau"
et menu Données/obtenir/de plage
sélectionner les 4 premières colonnes, clic droit "dépivoter les autres colonnes"
"charger"
désormais il suffit d'actualiser la requête
je suppose que ton nouveau tableau va servir à faire des TCD et des des graphiques
amitiés
Merci JMD pour l’astuce. C’est excellent.
La solution avec VBA permet de garder les cellules vides, ce qui est ben intéressent dans certains cas. Mais j’avoue que ta solution permet de faire des analyses à partir des TCD.
Chapeau à tous vous deux et problème résolu!