Je vais te proposer ma solution (exemple avec pays et localités, à adapter)
Je pars du principe que tu as une liste des pays et une liste des paires pays/fournisseur dans deux tableaux structurés Excel séparés (ça peut être des plages nommées, mais c'est mieux les tableaux structurés et les lignes qui trient les données dans la fonction utilisent les références structurées)
Dans le userform, deux combobox appelés cboCountries et cboCities et un bouton appelé btnValidate
Dans le module du userform, tu places le code suivant
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Option Explicit
Public Choice As String
Private mCities()
Property Let Cities(Value)
mCities = Value
End Property
Private Sub btnValidate_Click()
Choice = "Validate"
Me.Hide
End Sub
Private Sub cboCountries_Change()
PrepareCities
End Sub
Property Let Countries(Value)
cboCountries.List = Value
End Property
Sub PrepareCities()
Dim Counter As Long
cboCities.Clear
For Counter = LBound(mCities) To UBound(mCities)
If mCities(Counter, 2) = cboCountries.Value Then cboCities.AddItem mCities(Counter, 1)
Next Counter
End Sub |
Dans un module standard, tu as la
fonction suivante
1 2 3 4 5 6 7 8 9 10 11 12
| Function ChoiceCity() As String
' Tri des données
Range("t_Pays").Sort key1:=Range("t_Pays"), order1:=xlAscending, Header:=xlYes
Range("t_Villes").Sort key1:=Range("t_Villes[Pays]"), key2:=Range("t_Villes[Ville]"), Header:=xlYes
With usrChoiceCity
.Countries = Application.Transpose(Range("t_Pays[Pays]"))
.Cities = Range("t_Villes").Value
.Show
If .Choice = "Validate" Then ChoiceCity = .cboCities.Value
End With
Unload usrChoiceCity
End Function |
Cette fonction renvoie soit la localité choisie, soit une chaine vide si on a fermé sans cliquer sur validate.
Normalement, le code se lit facilement. Tu verras que ton userform
n'est pas couplé à Excel. Tu dois juste lui passer les tableaux remplis avant de l'afficher. J'ai mis le fichier exemple en pj.
Teste, étudie le code et reviens si pb...