XL 2013 [VBA]Créer un nombre de ligne en fonction d'un certain nombre de colonne et remplir ces lignes avec certaines valeurs

CaptainSalt31

XLDnaute Nouveau
Bonjour à tous,
Peut être que cette demande ne sera pas challengente pour tout le monde mais elle l'est pour moi. En effet vous trouverez en pièce jointe un fichier test avec les données a transformer dans la feuille 1 et l'attendu dans la feuille 2.
Les données à transformer sont à partir de la colonne 3, il peut y en avoir 12 ici comme 100.
Par exemple, pour la ligne 1 ici, il faut que 12 lignes soient créées dessous avec les informations de A2 et B2 dans chaque nouvelles lignes, il faut que les colonnes volumes et dates se créent en C et en D et que chaque ligne comporte une valeur en C et une en tête en D en suivant l'ordre des mois. et une fois la ligne 1 terminée il faut que ça puisse se répéter sur toutes les lignes jusqu'a la dernière ligne comportant des valeurs.
J'ai déjà réussi à faire la partie du code qui ajoute les lignes, copie les lignes et crée les colonnes que je compter enchainer avec des "call"
Mais je bloque vraiment sur la partie de transposition et je me dit que c'est peut être plus pratique de faire un code qui regroupe tout.
Merci d'avance pour votre aide !
 

Pièces jointes

  • TEst.xlsx
    11 KB · Affichages: 7

vgendron

XLDnaute Barbatruc
Hello

avec Power Query ca se fait tout seul (dépivoter les colonnes)
si tes données (feuil1) changent, il suffit de faire un clic droit actualiser sur le tableau résultat de la feuille 3
voir en PJ
 

Pièces jointes

  • TEst.xlsx
    22.7 KB · Affichages: 5

CaptainSalt31

XLDnaute Nouveau
Hello

avec Power Query ca se fait tout seul (dépivoter les colonnes)
si tes données (feuil1) changent, il suffit de faire un clic droit actualiser sur le tableau résultat de la feuille 3
voir en PJ

Hello, malheureusement j’ai une version d’excel qui restreint l’utilisation de power query. Ce qui me force dans ce cas a utiliser une macro !
Je garde bien au chaud la technique du power query pour d’autres sujets :)
 

vgendron

XLDnaute Barbatruc
Hello

Bon bah. avec cette macro ;)
VB:
Sub Depivoter()
Dim TabInit() As Variant
Dim TabFinal() As Variant

With Sheets("Feuil1")
    LastLine = .Range("A" & .Rows.Count).End(xlUp).Row
    TabInit = .Range("A1:N" & LastLine).Value
    NbLigne = UBound(TabInit, 1) - 1
    nbCol = UBound(TabInit, 2) - 2
End With
ReDim TabFinal(1 To (NbLigne * nbCol) + 1, 1 To 4)

'1ere ligne
TabFinal(1, 1) = "Produit"
TabFinal(1, 2) = "Lieu"
TabFinal(1, 3) = "Volumes"
TabFinal(1, 4) = "Dates"

indi = 2
For i = 2 To UBound(TabInit, 1)
    For j = 3 To UBound(TabInit, 2)
       TabFinal(indi, 1) = TabInit(i, 1)
       TabFinal(indi, 2) = TabInit(i, 2)
       TabFinal(indi, 3) = TabInit(i, j)
       TabFinal(indi, 4) = Format(TabInit(1, j), "mm-yyyy")
       indi = indi + 1
    Next j
Next i

With Sheets("Feuil2")
    .Range("A1").Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal
End With

End Sub
 

CaptainSalt31

XLDnaute Nouveau
Hello

Bon bah. avec cette macro ;)
VB:
Sub Depivoter()
Dim TabInit() As Variant
Dim TabFinal() As Variant

With Sheets("Feuil1")
    LastLine = .Range("A" & .Rows.Count).End(xlUp).Row
    TabInit = .Range("A1:N" & LastLine).Value
    NbLigne = UBound(TabInit, 1) - 1
    nbCol = UBound(TabInit, 2) - 2
End With
ReDim TabFinal(1 To (NbLigne * nbCol) + 1, 1 To 4)

'1ere ligne
TabFinal(1, 1) = "Produit"
TabFinal(1, 2) = "Lieu"
TabFinal(1, 3) = "Volumes"
TabFinal(1, 4) = "Dates"

indi = 2
For i = 2 To UBound(TabInit, 1)
    For j = 3 To UBound(TabInit, 2)
       TabFinal(indi, 1) = TabInit(i, 1)
       TabFinal(indi, 2) = TabInit(i, 2)
       TabFinal(indi, 3) = TabInit(i, j)
       TabFinal(indi, 4) = Format(TabInit(1, j), "mm-yyyy")
       indi = indi + 1
    Next j
Next i

With Sheets("Feuil2")
    .Range("A1").Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal
End With

End Sub
Merci ! Je teste et je reviens vers toi ;)
 

CaptainSalt31

XLDnaute Nouveau
Hello

Bon bah. avec cette macro ;)
VB:
Sub Depivoter()
Dim TabInit() As Variant
Dim TabFinal() As Variant

With Sheets("Feuil1")
    LastLine = .Range("A" & .Rows.Count).End(xlUp).Row
    TabInit = .Range("A1:N" & LastLine).Value
    NbLigne = UBound(TabInit, 1) - 1
    nbCol = UBound(TabInit, 2) - 2
End With
ReDim TabFinal(1 To (NbLigne * nbCol) + 1, 1 To 4)

'1ere ligne
TabFinal(1, 1) = "Produit"
TabFinal(1, 2) = "Lieu"
TabFinal(1, 3) = "Volumes"
TabFinal(1, 4) = "Dates"

indi = 2
For i = 2 To UBound(TabInit, 1)
    For j = 3 To UBound(TabInit, 2)
       TabFinal(indi, 1) = TabInit(i, 1)
       TabFinal(indi, 2) = TabInit(i, 2)
       TabFinal(indi, 3) = TabInit(i, j)
       TabFinal(indi, 4) = Format(TabInit(1, j), "mm-yyyy")
       indi = indi + 1
    Next j
Next i

With Sheets("Feuil2")
    .Range("A1").Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal
End With

End Sub
Hello ! Désolé pour la réponse lente il fallait que j’adapte le code à mon fichier qui diffère un peu mais tout fonctionne c’est le principal !
Merci beaucoup ☺️
 

Discussions similaires

Réponses
22
Affichages
691