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.
Je suis sûr et certain que le code du Klin89 devrait très bien marcher avec quelques ajustements mais j’arrive pas à le faire.

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 .

38matrice-vba.xlsx (92.87 Ko)

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!

Rechercher des sujets similaires à "matrice vba convertir colonnes lignes"