Sub Macro1()
Dim T As Worksheet 'déclare la variable T (onglet Tableau)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim K As Long 'déclare la variable K (incrément)
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Long 'déclare la variable I (Incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim J As Long 'déclare la variable J (incrément)
Dim COL As Integer 'déclare la variable COL (COLonne)
Dim LI As Integer 'déclare la variable LI (Ligne)
'*******************************
'Liste des produits sans doublon
'*******************************
Set T = Worksheets("Tableau") 'définit le tableau T
T.Cells.Clear 'efface d'eventuelles anciennes données dans l'onglet T
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
K = 2 'initialise la variable K
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
If O.Name <> T.Name Then 'condition : si le nom de l'onglet O est différent de "Tableau"
TV = O.Range("A1").CurrentRegion 'définit la tableau de valeurs TV
For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec la donnée ligne I colonne 1 de TV
Next I 'prochaine ligne de la boucle 2
'renvoie dans la cellule ligne 1 colonne K de l'onglet T, le nom de l'onglet au format texte
'avec une apostrophe devant pour éviter l'inversion des jours et des mois
T.Cells(1, K) = "'" & O.Name
K = K + 1 'incrémente K
End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
T.Range("A1") = "Produits" 'écrit dans la cellule A1 de l'onglet T
'renvoie dans la cellule A2 redimensionnée de l'onglet T le tableau TMP transposé (donc la liste des produits sans doublon)
T.Range("A2").Resize(D.Count, 1).Value = Application.Transpose(TMP)
'****************************************************
'récupération et placement des ventes dans l'onglet T
'****************************************************
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments J du tableau temporaire TMP
For Each O In Sheets 'boucle 2 : sur tous les onglets O du classeur
If O.Name <> T.Name Then 'condition 1 : si le nom de l'onglet O est différent de "Tableau"
TV = O.Range("A1").CurrentRegion 'définit la tableau de valeurs TV
For I = 1 To UBound(TV, 1) 'boucle 3 : sur toutes les lignes I du tableau des valeurs TV
If TV(I, 1) = TMP(J) Then 'condition 2 : si la donnée ligne I colonne 1 de TV est égale à l'élément J de TMP
COL = T.Rows(1).Find(O.Name, , xlFormulas, xlWhole).Column 'définit la colonne COL
LI = T.Columns(1).Find(TMP(J), , xlValues, xlWhole).Row 'définit la ligne LI
'renvoie dans la cellule ligne LI colonne Col de l'onglet T la donnée ligne I colonne 2 de TV
T.Cells(LI, COL) = TV(I, 2)
Exit For 'sort de la boucle 3
End If 'fin de la condition 2
Next I 'prochaine ligne de la boucle 3
End If 'fin de la condition 1
Next O 'prochain onglet de la boucle 2
Next J 'prochain élément de la boucle 1
T.Activate 'active l'onglet T
T.Range("B2").Select 'sélectionne la cellule B2
ActiveWindow.FreezePanes = True 'fige les volets
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Fin du traitement des données!" 'message
End Sub