XL 2019 VBA: transposer une table avec des dates

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Je suis novice en VBA. Depuis deux jours j'essaye de transposer mes données (avec Resize(UBound(Table2, 1), UBound(Table2, 2)) = Table2, Application.transpose(Tbl1)), mais je ne retrouve pas le résultat désiré. Voici mes données:
28/08/2020​
140,44​
FR0010923359
14/10/2020​
129,16​
FR0010923359
15/10/2020​
128,28​
FR0010923359
16/10/2020​
128,87​
FR0010923359
19/10/2020​
128,92​
FR0010923359
28/08/2020​
146,84​
FR0010923367
14/10/2020​
129,4​
FR0010923367
15/10/2020​
127,77​
FR0010923367
16/10/2020​
129,15​
FR0010923367
17/10/2020​
127,8​
FR0010923367
19/10/2020​
130,23​
FR0010923367

Le résultat désiré est:
28/08/2020​
14/10/2020​
15/10/2020​
16/10/2020​
17/10/2020​
19/10/2020​
FR0010923359
140,44​
129,16​
128,28​
128,87​
.
128,92​
FR0010923367
146,84​
129,4​
127,77​
129,15​
127,8​
130,23​

Merci beaucoup de votre aide!
Marie
 
Solution
Bonjour MarieParis, JHA, vgendron, Amilo,

Voyez le fichier .xlsx joint avec le tableau structuré en A1:C12.

Formule matricielle en F2 à valider par Ctrl+Maj+Entrée et tirer vers la droite :
Code:
=SIERREUR(PETITE.VALEUR(SI(NON(NB.SI($E2:E2;Tableau1[Date]));Tableau1[Date]);1);"")
Formule matricielle en E3 à valider par Ctrl+Maj+Entrée et tirer vers le bas :
Code:
=SIERREUR(INDEX(C:C;PETITE.VALEUR(SI(NON(NB.SI(E$2:E2;Tableau1[Ref]));LIGNE(Tableau1));1));"")
Formule en F3 à tirer à droite et vers les bas :
Code:
=SOMMEPROD((INDEX(Tableau1;;1)=F$2)*(INDEX(Tableau1;;3)=$E3);INDEX(Tableau1;;2))
A+

vgendron

XLDnaute Barbatruc
Hello
S'il s'agit d'un exercice pour apprendre le vba, je te propose juste quelques pistes de travail
1) récuperer le tablo initial
VB:
With ActiveSheet
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A2:C" & Fin).Value
End With
2) déterminer le nombre de lignes du tableau final = nombre de codes différents dans le tablo Init
utilisation de dictionnaire pour compter sans doublon
3) déterminer le nombre de colonnes du tableau final = nombre de dates différentes dans le tablo final
utilisation de dictionnaire pour compter sans doublon

4) construire le tablo final:
==> Colonnes = dates dans l'ordre chronologique ==trier tableau
==> Lignes = codes dans l'ordre
==> remplir les cases...
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Hello
S'il s'agit d'un exercice pour apprendre le vba, je te propose juste quelques pistes de travail
1) récuperer le tablo initial
VB:
With ActiveSheet
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A2:C" & Fin).Value
End With
2) déterminer le nombre de lignes du tableau final = nombre de codes différents dans le tablo Init
utilisation de dictionnaire pour compter sans doublon
3) déterminer le nombre de colonnes du tableau final = nombre de dates différentes dans le tablo final
utilisation de dictionnaire pour compter sans doublon

4) construire le tablo final:
==> Colonnes = dates dans l'ordre chronologique ==trier tableau
==> Lignes = codes dans l'ordre
==> remplir les cases...

Merci!
Justement, je ne trouve pas comment remplir les cases pour conserver les valeurs manquantes (comme pour le 17/10).
 

vgendron

XLDnaute Barbatruc
une méthode comme une autre (ne correspond pas du tout à la proposition faite plus haut)
VB:
Sub Transpose2()
With Sheets("Feuil1") 'récupère les données
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A2:C" & Fin).Value
End With

DebCode = 3
FinCode = 3
DebDate = 2
FinDate = 2
With Sheets("Feuil2")
    For i = LBound(tabInit, 1) To UBound(tabInit, 1) 'pour chaque ligne du tableau
        Set CodeExiste = .Range("A:A").Find(tabInit(i, 3)) 'on regarde si le code est déjà présent dans la colonne A
        If CodeExiste Is Nothing Then 's'il n'apparait pas..on l'ajoute en dessous
            .Range("A" & FinCode) = tabInit(i, 3)
            LinePos = FinCode 'et on note la ligne de remplissage
            FinCode = FinCode + 1
        Else
            LinePos = CodeExiste.Row 'on note la ligne de remplissage
        End If
        
        Set DateExiste = .Rows("1:1").Find(tabInit(i, 1)) 'idem pour la date sur la ligne 1
        If DateExiste Is Nothing Then
            .Cells(1, FinDate) = tabInit(i, 1)
             ColPos = FinDate
            FinDate = FinDate + 1
        Else
            ColPos = DateExiste.Column
        End If
        .Cells(LinePos, ColPos) = tabInit(i, 2) 'on met la quantité
    Next i
End With
End Sub

reste à trier les colonnes dans l'ordre chronologique
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
une méthode comme une autre (ne correspond pas du tout à la proposition faite plus haut)
VB:
Sub Transpose2()
With Sheets("Feuil1") 'récupère les données
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row
    tabInit = .Range("A2:C" & Fin).Value
End With

DebCode = 3
FinCode = 3
DebDate = 2
FinDate = 2
With Sheets("Feuil2")
    For i = LBound(tabInit, 1) To UBound(tabInit, 1) 'pour chaque ligne du tableau
        Set CodeExiste = .Range("A:A").Find(tabInit(i, 3)) 'on regarde si le code est déjà présent dans la colonne A
        If CodeExiste Is Nothing Then 's'il n'apparait pas..on l'ajoute en dessous
            .Range("A" & FinCode) = tabInit(i, 3)
            LinePos = FinCode 'et on note la ligne de remplissage
            FinCode = FinCode + 1
        Else
            LinePos = CodeExiste.Row 'on note la ligne de remplissage
        End If
       
        Set DateExiste = .Rows("1:1").Find(tabInit(i, 1)) 'idem pour la date sur la ligne 1
        If DateExiste Is Nothing Then
            .Cells(1, FinDate) = tabInit(i, 1)
             ColPos = FinDate
            FinDate = FinDate + 1
        Else
            ColPos = DateExiste.Column
        End If
        .Cells(LinePos, ColPos) = tabInit(i, 2) 'on met la quantité
    Next i
End With
End Sub

reste à trier les colonnes dans l'ordre chronologique

Merci beaucoup!

Le code marche bien.
Si je positionne les données à VIDE comme "NC" ils restent à VIDE. La table n'accepte pas les données mixtes (numériques et caractères) ?
On récupère les données dans TabInit déjà transposé?

Est-ce que j'ai bien déclaré les variables:
Dim Fin, tabInit, CodeExiste, DateExiste, ColPos, FinDate
Dim DebCode As Integer, FinCode As Integer, DebDate As Integer, i As Integer, LinePos As Integer ?

Merci beaucoup de votre aide, j'ai vraiment beaucoup appris! :)
 

job75

XLDnaute Barbatruc
Bonjour MarieParis, JHA, vgendron, Amilo,

Voyez le fichier .xlsx joint avec le tableau structuré en A1:C12.

Formule matricielle en F2 à valider par Ctrl+Maj+Entrée et tirer vers la droite :
Code:
=SIERREUR(PETITE.VALEUR(SI(NON(NB.SI($E2:E2;Tableau1[Date]));Tableau1[Date]);1);"")
Formule matricielle en E3 à valider par Ctrl+Maj+Entrée et tirer vers le bas :
Code:
=SIERREUR(INDEX(C:C;PETITE.VALEUR(SI(NON(NB.SI(E$2:E2;Tableau1[Ref]));LIGNE(Tableau1));1));"")
Formule en F3 à tirer à droite et vers les bas :
Code:
=SOMMEPROD((INDEX(Tableau1;;1)=F$2)*(INDEX(Tableau1;;3)=$E3);INDEX(Tableau1;;2))
A+
 

Pièces jointes

  • MarieParis(1).xlsx
    12.2 KB · Affichages: 11

Amilo

XLDnaute Accro
Re,
Bonjour job75,

Merci!Je ne connais pas Power Query, c’est du VBA ?

@MarieParis, désolé le retour tardif, j'étais toute la journée très occupé.
Sinon, Power Query n'est pas du VBA, je vous laisse découvrir la solution en vidéo

Cordialement
 

Pièces jointes

  • MarieParis_PQ.xlsm
    27.6 KB · Affichages: 1
Dernière édition:

Amilo

XLDnaute Accro
Re,

@MarieParis
Je n'avais pas compris qu'il fallait faire la somme des montants en cas de dates identiques,
Mon fichier en pièce jointe effectue la somme.
Dans l'éditeur Power query, il faut simplement sélectionner "Somme" au lieu de "Ne pas agréger"
(voir capture pour la manipulation)

Cordialement
 

Pièces jointes

  • Transpose.jpg
    Transpose.jpg
    217.1 KB · Affichages: 5
  • MarieParis_PQ.xlsm
    27.7 KB · Affichages: 1
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 709
Messages
2 081 769
Membres
101 816
dernier inscrit
Jfrcs