Option Explicit
Private pl As Range 'déclare la variable pl (PLage)
Private cel As Range 'déclare la variable cel (CELlule)
Private dico As Object 'déclare la variable dico (DICiOnnaire)
Private temp As Variant 'déclare la variable temp (TEMPoraire)
Private Sub UserForm_initialize() 'à l'initialisation de l'UserForm
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
With Sheets("bdcontact") 'prend en compte l'onglet "bdcontact"
Set pl = .Range("B4:B" & Cells(Application.Rows.Count, 2).End(xlUp).Row) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule cel de la boucle
End With 'fin de la prise en compte de l'onglet "bdcontact"
temp = dico.keys 'récupère les éléments du dictionnaire sans doublon
Call tri(temp, LBound(temp, 1), UBound(temp, 1)) 'classement par ordre croissant
mdrtype.List = temp 'alimente la combobox "Type de Contact" par la liste sans doublon
End Sub
Private Sub mdrtype_Change() 'au changement dans la combobox "Type de Contact"
Me.mdrsociete.Clear 'vide la combobox "Société"
Me.Listnom.Clear 'vide la listbox "Nom"
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
'si la valeur de la cellule cel est égale à la valeur de la combobox "Type de Contact", alimente le dictionnaire dico
If cel.Value = Me.mdrtype.Value Then dico(cel.Offset(0, 1).Value) = ""
Next cel 'prochaine cellule cel de la boucle
temp = dico.keys 'récupère les éléments du dictionnaire sans doublon
Call tri(temp, LBound(temp, 1), UBound(temp, 1)) 'classement par ordre croissant
mdrsociete.List = temp 'alimente la combobox "Société" par la liste sans doublon
End Sub
Private Sub mdrsociete_Change() 'au changement dans la combobox "Société"
Me.Listnom.Clear 'vide la listbox "Nom"
If Me.mdrtype.Value <> "" Then 'condition 1 : si la combobox "Type de Contact" n'est pas vide
For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
'condition 2 : si le type de contact et le nom de la société coïncident avec les comboboxes mdrtype et mdrsociete
If cel.Value = Me.mdrtype.Value And cel.Offset(0, 1).Value = Me.mdrsociete Then
Me.Listnom.AddItem (cel.Offset(0, 3).Value) 'ajoute le nom à la listbox
End If 'fin de la condition 2
Next cel 'prochaine cellule cel de la boucle
End If 'fin de la condition 1
End Sub
Sub tri(a, gauc, droi)
Dim ref As String
Dim g As Integer
Dim d As Integer
Dim temp 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
temp = a(g): a(g) = a(d): a(d) = temp
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