Sub EDS()
Dim OM As Object 'déclare la variable OM (Onglet Modèle)
Dim PM As Range 'déclare la vareiable PM (Plage Modèle)
Dim OB As Object 'déclare la variable OB (Onglet de Base)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim PLV As Range 'déclare la variable PLV (PLage des cellules Visibles)
Dim OD As Object 'déclare la variable OD (Onglet de destination)
Dim LI As Byte 'déclare la variable LI (LIgne)
Set OM = Sheets("Modèle") 'définit l'onglet OM
Set PM = OM.Range("A1:K213") 'définit la plage PM
Set OB = Sheets("majMP") 'définit l'onglet OB
If UCase(OB.Range("A1").Value) <> "COMPTE" Then 'condition : si la valeur en majuscule de la cellule A1 de l'onglet OB est différente de "COMPTE"
OB.Rows(1).Insert 'insère une ligne
OB.Range("A1").Value = "Compte" 'place l'étiquette
OB.Range("B1").Value = "Date" 'place l'étiquette
OB.Range("C1").Value = "Nº Pc" 'place l'étiquette
OB.Range("D1").Value = "Libellé" 'place l'étiquette
OB.Range("E1").Value = "Tiers" 'place l'étiquette
OB.Range("F1").Value = "Débit" 'place l'étiquette
OB.Range("G1").Value = "Crédit" 'place l'étiquette
End If 'fin de la condition
DL = OB.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet OB
Set PL = OB.Range("A2:A" & DL) 'définit la plage PL (à partir de la ligne 2)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
If CEL.Value <> "" Then D(CEL.Value) = "" 'si la cellule n'est pas vide, alimente le dictionnaire D
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère les valeurs uniques (sans doublons) de la colonne A dans le tableau temporaire TMP
For I = 0 To UBound(TMP) 'boucle sur toutes les valeurs (uniques) du tableau TMP
LI = 10 'initialise la variable LI
OB.Range("A1").AutoFilter Field:=1, Criteria1:=TMP(I) 'filtre la colonne 1 (=A) avec TMP(I) comme critère
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV des cellule visibles (non filtrée) de la plage PL
Application.Sheets.Add after:=Sheets(Sheets.Count) 'ajoute un nouvel onglet en dernière position
Set OD = ActiveSheet 'définit l'onglet de destination OD
OD.Name = TMP(I) 'renomme l'onglet avec le nom de la valeur unique
PM.Copy 'copy la plage PM
OD.Range("A1").PasteSpecial (xlPasteColumnWidths) 'colle la largeur des colonnes
PM.Copy OD.Range("A1") 'colle la plage PM
OD.Range("A1").Value = TMP(I) 'récupère la valeur unique en A1
For Each CEL In PLV 'boucle sur toutes les cellules CEL de la plage PLV
OD.Cells(LI, 1).Value = CEL.Offset(0, 1).Value 'récupère la date
OD.Cells(LI, 3).Value = CEL.Offset(0, 3).Value 'récupère le libellé
OD.Cells(LI, 4).Value = IIf(CEL.Offset(0, 5).Value = 0, "C", "D") 'récupère "D" ou "C"
OD.Cells(LI, 5).Value = IIf(CEL.Offset(0, 5).Value = 0, CEL.Offset(0, 6).Value, CEL.Offset(0, 5).Value) 'récupère la valeur du crédit ou débit
LI = LI + 1 'incrément la ligne LI
Next CEL 'prochaine cellule de la boucle
OD.Rows(LI & ":209").Delete 'efface les ligne superflues du modèle
OB.Range("A1").AutoFilter 'supprime le filtre automatique
OD.Range("A1").Select 'sélectionne la cellule A1
Next I 'nouvelle valeur unique de la boucle
End Sub