Sub Macro2()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableu des Valeurs)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Integer 'déclare la variable L (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Set OS = Worksheets("KP02") 'définit l'onglet source OS
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonne NC du tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 du tableau des valeurs (CODEDEPT)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des données du dictionnaire D sans doublon
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les élément du tableau temporaire TMP
Set OD = Application.Worksheets.Add 'définit l'onglet Destination OD (nouvel onglet vierge)
OD.Name = TMP(J) 'renomme l'onglet source
OD.Move after:=Sheets(Sheets.Count) 'déplace l'ongelt en dernière position
OD.Range("A1").Resize(1, NC).Value = Application.Index(TV, 1) 'renvoie la première ligne du tableau des valeurs TV dans la cellule A1 redimensionnée de l'onglet destination OD
Erase TL 'efface le tableau TL et réinitialise la variable K
For I = 2 To NL 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If TV(I, 2) = TMP(J) Then 'condition : si la donnée ligne de la boucle 2 colonne 2 est égale à l'élément de la boucle 1
ReDim Preserve TL(1 To NC, 1) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes)
For L = 1 To NC - 1 'boucle 3 : sur toutes les colonnes L du tableau des valeurs TV
TL(L, 1) = TV(I, L) 'récupère dans la ligne L de TL la donnée en colonne L de TV (=> Transposition)
Next L 'prochaine colonne de la boucle 3
TL(NC, 1) = CDbl(TL(NC, 1)) + CDbl(TV(I, NC)) 'ajoute les MT
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 2
If K > 1 Then 'condition : si K est supérieur à 1
For I = 1 To UBound(TL, 1) 'boucle sur toutes les lignes I de TL
OD.Cells(2, I).Value = TL(I, 1) 'renvoie dans la cellule ligne 2 colonne I de l'onget OD la valeur de la donnée ligne I colonne 1 de TL
Next I 'prochaine ligne de la boucle
End If 'fin de la condition
Next J 'prochain élément de la boucle 1
End Sub