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:
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...
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...
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
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
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!
@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
@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)