Bonsoir le fil, bonsoir le forum,
Une proposition VBA avec le code commenté ci-dessous :
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim T1 As String 'déclare la variable T1 (donnée Temporaire 1)
Dim T2 As Integer 'déclare la variable T2 (donnée Temporaire 2)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TT1 As Variant 'déclare la variable TT1 (Tableau Temporaire 1)
Dim TT2 As Variant 'déclare la variable TT2 (Tableau Temporaire 2)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim VB As Integer 'déclare la variable VB (Valeur en colonne B)
Set O = Sheets("Feuil1") 'définit l'onglet O
TC = O.Range("A3").CurrentRegion 'définit le tableau de cellules TC
'tri des données
For I = 1 To UBound(TC, 1) 'boucle 1 : sur toutes les lignes du tableau TC
For J = 1 To UBound(TC, 1) 'boucle 2 : sur toutes les lignes du tableau TC
'condition : si la valeur en colonne B de la boucle 1 est inférieure à la valeur de la colonne B de la boucle 2
If TC(I, 2) < TC(J, 2) Then
'la temporaire t1 prend la valeur de la colonne A de la boucle 1
'la temporaire t2 prend la valeur de la colonne B de la boucle 1
T1 = TC(I, 1): T2 = TC(I, 2)
'la valeur en colonne A de la boucle 1 prend la valeur en colonne A de la boucle 2
'la valeur en colonne B de la boucle 1 prend la valeur en colonne B de la boucle 2
TC(I, 1) = TC(J, 1): TC(I, 2) = TC(J, 2)
'la valeur en colonne A de la boucle 2 prend la valeur de la temporaire t1
'la valeur en colonne B de la boucle 2 prend la valeur de la temporaire t2
TC(J, 1) = T1: TC(J, 2) = T2
End If 'fin de la condition
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
'récupération des doublons
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnair D
For I = 1 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC
D(TC(I, 1)) = D(TC(I, 1)) + 1 'alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
TT1 = D.keys 'récupère dans la tableau temporaire TT1 la liste des valeur en colonne A de TC sans doublon
TT2 = D.items 'récupère dans la tableau temporaire TT2 le nombre d'occurrence de chaque élément de la liste
'effacement des ancienne données
O.Range(O.Cells(1, 8), O.Cells(1, Application.Columns.Count)).EntireColumn.Clear
'renvoie des données dans l'onglet O
For I = 1 To UBound(TC, 1) 'boucle 1 sur toutes les lignes du tableau tc
For J = 0 To UBound(TT1, 1) 'boucle 2 sur tous les éléments (sans doublon) du tableau tc
If TT2(J) > 1 Then 'condition 1 : si le nombre de d'occurrence de l'élément est supérieur à 1
If TC(I, 1) = TT1(J) Then 'condition 2 : si la valeur en colonne A de TC est égale à l'élément de TT1
If TC(I, 2) = VB Then 'condition 3 : si la valeur de la colonne B de TC est égale à VB
Set DEST = DEST.Offset(1, 0) 'définit la cellule de destination DEST (la ligne en dessous)
Else 'sinon
'définit la cellule de destination DEST (ligne 1 décalée de deux colonnes à droite)
Set DEST = IIf(O.Range("H1") = "", O.Range("H1"), O.Cells(1, Application.Columns.Count).End(xlToLeft).Offset(0, 2))
End If 'fin de la condition 3
DEST.Value = TC(I, 1) 'renvoie dans DEST la valeur en colonne A de TC
DEST.Offset(0, 1).Value = TC(I, 2) 'renvoie dans DEST déclalée d'une colonne à droite la valeur en colonne B de TC
VB = TC(I, 2) 'redéfinit la variable VB
End If 'fin de la condition 2
End If 'fin de la condition 1
Next J 'prochain élément de la boucle 2
Next I 'prochaine ligne de la boucle 1
End Sub