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.
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 Subklin89
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.CountCi-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 WithSheets(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 Subklin89
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?