Option Explicit
Dim Ws As Worksheet, EnPhaseDInitialisation As Boolean
Private Sub UserForm_Initialize()
'Affectation des valeurs du ComboBox1
Val_ComboBox 1
End Sub
Private Sub ComboBox1_Change()
If EnPhaseDInitialisation Then Exit Sub
'Affectation des valeurs du ComboBox2
Val_ComboBox 2, ComboBox1.Value
End Sub
Private Sub ComboBox2_Change()
If EnPhaseDInitialisation Then Exit Sub
'Affectation des valeurs du ComboBox3
Val_ComboBox 3, ComboBox1.Value, CDbl(ComboBox2.Value)
End Sub
'Procédure pour affecter des valeurs aux ComboBox
Private Sub Val_ComboBox(CbxIndex As Integer, ParamArray Cible() As Variant)
Dim NbLignes As Long, TV As Variant, Cbx As ComboBox, L As Long, ÀRetenir As Boolean, C As Long
'Définit la feuille contenant les données
Set Ws = Worksheets("DB_Schlauch")
'Définit le nombre de lignes dans la colonne A
NbLignes = Ws.Range("A65536").End(xlUp).Row
'Met une bonne fois pour toutes en tableau dans un variant les valeurs des plages, pour limiter les requêtes Excel
TV = Ws.Range("A3:C" & NbLignes).Value
'Définit le ComboBox à remplir
Set Cbx = Me.Controls("ComboBox" & CbxIndex)
EnPhaseDInitialisation = True ' Pour ne plus provoquer de récursions
'Supprime les anciennes données
Cbx.Clear
'Boucle sur les lignes de la colonne A (à partir de la 3eme ligne)
For L = 1 To UBound(TV)
'Remplit le ComboBox sans doublons
Cbx.Value = TV(L, CbxIndex): ÀRetenir = Cbx.ListIndex = -1
'Alimentation conditionnelle du Combobox en fonction de ce qui est sélectionnée dans les contrôles précédents éventuels:
For C = 1 To CbxIndex - 1 ' 1 to -1 ==> ne passe du tout dans la boucle
If Not ÀRetenir Then Exit For
ÀRetenir = TV(L, C) = Cible(C - 1) ' Parce qu'un ParamArray démarre à 0
Next C
If ÀRetenir Then Cbx.AddItem TV(L, CbxIndex)
Next L
EnPhaseDInitialisation = False
'Positionne sur le premier élément si la liste n'est pas vide
If Cbx.ListCount > 0 Then Cbx.ListIndex = 0
End Sub