Public Sub Workbook_Open()
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim i As Integer 'déclare la variable i (Incrément)
Dim lst As String 'déclare la variable lst (LiSTe de validation)
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
dl = .Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la variable dl (dernière ligné éditée de la colonne 2 (=B)
Set pl = .Range("B3:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère la liste sans doublon
Call tri(temp, LBound(temp, 1), UBound(temp, 1)) 'lance la procédure de tri alphabétique sans doublon
For i = 0 To UBound(temp, 1) 'boucle sur tous les éléments du tableau temp
lst = IIf(lst = "", temp(i) & ",", lst & temp(i) & ",") 'définit la liste lst
Next i 'prochain élément de la boucle
With .Range("E2").Validation 'prend en compte la validation de données de la cellle E2
.Delete 'supprime une éventuelle validation de données déjà existante
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=lst 'ajoute la liste lst comme validation de données
End With 'fin de la prose en compte de la validation de données de la cellule E2
End With 'fin de la prise en compte de l'onglet "Feuil1"
End Sub
Sub tri(a As Variant, gauc As Integer, droi As Integer) 'tiré du site de Jacques BOISGONTIER : [url=http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm]Objet dictionary[/url]
Dim ref As String
Dim g As Integer, d As Integer
Dim tmp As String
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
tmp = a(g): a(g) = a(d): a(d) = tmp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub