Transposition de tableau vers une autre feuille

bonjour à toutes et à tous.

J'ai beau faire le tour des différents forums et sites VBA, je n'arrive pas solutionner mon problème de transposition de données. Je comprends qu'il existe une solution de transposition dans excel, mais cela ne peu convenir à mon cas car j'ai une foule de données, organisées de manières à ce que cette solution ne convient pas.

Je souhaiterai transposer un tableau d'une feuille sur une autre feuille avec comme contrainte :

* répéter autant de fois que nécessaire la première cellule sur chaque nouvelle ligne

* transposer les blocs de 3 colonnes sur chaque nouvelle ligne.

* Suppression des lignes vides

J'espère avoir été assez clair dans mes explications de novice en code VBA.

Ci joint ce que j'ai et ce que j'aimerai avoir.

Si une solution venait à être trouvée, serait-il possible d'avoir une explication du script VBA , je vous en serai de plus très reconnaissant pour mes apprentissages en codage.

Merci d'avance.

18bernie.xlsx (28.62 Ko)

Bonsoir bernie3vallees,

Je me suis arrêter à 256 colonnes

Restitution sur la feuille située en 3ème position dans ton classeur

Option Explicit
Sub test()
Dim a, b(), i As Long, j As Long, n As Long
    With Sheets(1).Range("A1").CurrentRegion
        a = Application.Index(.Value, _
                              Evaluate("row(1:" & .Rows.Count & ")"), _
                              Array(1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, _
                                    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, _
                                    74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, _
                                    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, _
                                    103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 115, _
                                    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, _
                                    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 140, _
                                    141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, _
                                    153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, _
                                    165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, _
                                    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, _
                                    190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, _
                                    203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, _
                                    215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, _
                                    227, 228, 229, 230, 231, 233, 234, 235, 236, 237, 238, 239, _
                                    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, _
                                    252, 253, 254, 255, 256))
    End With
    ReDim b(1 To (((UBound(a, 2) - 1) / 3) * (UBound(a, 1) - 1)) + 1, 1 To 4)
    b(1, 1) = "Nom de la recette": b(1, 2) = "Mesure"
    b(1, 3) = "Unité": b(1, 4) = "Ingrédient"
    n = 1
    For i = 2 To UBound(a, 1)
        For j = 2 To UBound(a, 2) Step 3
            If a(i, j) <> "" Then
                n = n + 1
                b(n, 1) = a(i, 1)
                b(n, 2) = a(i, j)
                b(n, 3) = a(i, j + 1)
                b(n, 4) = a(i, j + 2)
            End If
        Next
    Next
    'Restitution
    Application.ScreenUpdating = False
    With Sheets(3).Range("A1").Resize(n, UBound(b, 2))
        .CurrentRegion.Cells.Clear
        .Value = b
        With .Rows(1)
            .BorderAround Weight:=xlThin
            .Interior.ColorIndex = 44
            .HorizontalAlignment = xlCenter
        End With
        .Font.Name = "calibri"
        .Font.Size = 10
        .BorderAround Weight:=xlThin
        .Borders(xlInsideVertical).Weight = xlThin
        .VerticalAlignment = xlCenter
        .Columns.AutoFit
    End With
    Application.ScreenUpdating = True
End Sub

klin89

Bonsoir

Woaw, quel travail..... Merci beaucoup. bon je ne comprends pas tout, donc il va falloir que j'y travaille dessus.

Désolé si je fait le boulet, mais lorsque j'ai copié/collé le code et que je l'ai inséré dans la copie de mon fichier, j'ai une "erreur d'exécution '13' : Incompatibilité de type "qui est apparu à la 4ème ligne (celle avec a=Application.index......)

J'ai essayé de changer le nom des feuilles (sheets(1) ) mais non..... ça marche pas.

C'est pour cela que j'aurai aimé comprendre ce qui a été fait de telle sorte à pouvoir reproduire ce type de codage, avec des feuilles un peu différentes, dans le futur.

Re bernie3vallees,

Mais il comporte combien de colonnes ton tableau original

Sheets(1).Range("A1").CurrentRegion.Columns.Count

Ci-dessous, la variable tableau prend en compte les colonnes concernées par le traitement

C'est à dire la 1ère et toutes les colonnes composant tes blocs de 3 soit mesure + unite + Ingredient

With Sheets(1).Range("A1").CurrentRegion
      a = Application.Index(.Value, _
                    Evaluate("row(1:" & .Rows.Count & ")"), _
                    Array(1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, _
                    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, _
                    74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, _
                    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, _
                    103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 115, _
                    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, _
                    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 140, _
                    141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, _
                    153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, _
                    165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, _
                    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, _
                    190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, _
                    203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, _
                    215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, _
                    227, 228, 229, 230, 231, 233, 234, 235, 236, 237, 238, 239, _
                    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, _
                    252, 253, 254, 255, 256))
    End With

Sheets(1) = feuille en 1ère position dans ton classeur

La propriété CurrentRegion se traduit au clavier manuellement par Crtl + *

Place toi en A1 et exécute ce raccourci pour visualiser la plage qui sera traitée.

klin89

Bonjour à nouveau.....

Lorsque je me place en A1 et que je fait le raccourci CTRL+*, la plage sélectionnée est [A1:JN10]. cela fait donc 274 colonnes......

A partir de la colonne AT appelée Etape_1, j'ai 10 ingrédients, puis une colonne Etape_2 et 10 autres ingrédients, et cela se répète 7 fois. Chaque ingrédient utilise lui même 3 colonne (appelées "mesure", "unité" et "ingrédient").

Voilà quelques explications. N'est-il pas possible d'utiliser mon fichier fourni pour essayer le code?

Néanmoins, merci pour le temps consacré à la recherche d'une solution qui semble un peu plus difficile qu'il n'y parait?

Re

Exécute ce code et vois ce qui est restitué dans la 3ème feuille de ton classeur

Est-ce les bonnes colonnes

Si non, modifie et complète les dans l'array ci-dessous :

Je suis sous Excel2003, je me suis arrêter à la colonne

AT est la 46 ème colonne ----> Array(1, 47 .......etc)

Option Explicit
Sub Restitution_du_tableau_a_traiter()
Dim a
    With Sheets(1).Range("A1").CurrentRegion
      a = Application.Index(.Value, _
                    Evaluate("row(1:" & .Rows.Count & ")"), _
                    Array(1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, _
                    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, _
                    74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, _
                    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, _
                    103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 115, _
                    116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, _
                    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 140, _
                    141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, _
                    153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, _
                    165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, _
                    178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, _
                    190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, _
                    203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, _
                    215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, _
                    227, 228, 229, 230, 231, 233, 234, 235, 236, 237, 238, 239, _
                    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, _
                    252, 253, 254, 255, 256))'<-------------------- 256
    End With
   'Restitution
    With Sheets(3).Range("A1").Resize(UBound(a, 1), UBound(a, 2))
        .Value = a
    End With
End Sub

klin89

Re......

Désolé, lais j'ai toujours le même code erreur. Le code erreur s'applique à la ligne Application.index, donc le processus s'arrète avant l'ouverture de la feuille 3.

et encore désolé de t'avoir infligé tant de tracas.........

RIP?

Rechercher des sujets similaires à "transposition tableau feuille"