Voir le flux RSS

Pierre Fauconnier

De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform

Noter ce billet
par , 02/05/2018 à 16h56 (1031 Affichages)
Salut.

A nouveau une discussion sur le forum Excel VBA qui illustre une mauvaise utilisation du userform, que l'on couple de manière très forte à Excel en utilisant des plages Excel dans la procédure Initialize du userform. Je propose une solution découplée d'Excel ou les variables du userform sont utilisées avant son affichage. Le userform est appelé au sein d'une fonction qui va renvoyer la valeur saisie dans un combobox du userform.

Citation Envoyé par Pierre Fauconnier Voir le message
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
J'ai ajouté le fichier de démo en pièce jointe. Ca peut toujours servir...

Alors, ça vous aide dans la gestion des userforms en VBA?
Miniatures attachées Fichiers attachés

Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Viadeo Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Twitter Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Google Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Facebook Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Digg Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Delicious Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog MySpace Envoyer le billet « De la bonne utilisation des userforms en VBA (3): Combobox en cascades dans un userform » dans le blog Yahoo

Mis à jour 08/08/2018 à 10h12 par Pierre Fauconnier

Catégories
Programmation , VBA , Excel , MS Office

Commentaires

  1. Avatar de MarcelG
    • |
    • permalink
    Bonjour Pierre,

    Je me réfère à ce développement par rapport à cette discussion (pour laquelle, au passage, je n'ai pas aperçu de fichier joint).

    Tu fais allusion, dans ce billet, à une discussion. En as-tu le lien?

    Ici, dans le code du formulaire, que représente "Value" en tant que paramètre des 2 Property.

    Sans doute par ignorance, j'ai du mal à m'y retrouver, surtout lorsque des mots clés de VBA sont ainsi utilisés.
    Je ne vois pas explicitement la logique de ce code. Trop fort pour moi

    Merci pour ton retour.

    Cordialement.

    Marcel
  2. Avatar de MarcelG
    • |
    • permalink
    Au temps pour moi!

    Tu injectes dans les Property les valeurs définies dans le module standard. D'où d'ailleurs Property Let
    C'est le "Value" qui m'interpellait.

    Perso, je préfère ce type de développement à celui que tu exposais dans la discussion que j'ai consultée.

    D'autant qu'il est adaptable à x combobox.

    A plus tard.
  3. Avatar de Pierre Fauconnier
    • |
    • permalink
    Bonjour Marcel

    Citation Envoyé par MarcelG
    [...]pour laquelle, au passage, je n'ai pas aperçu de fichier joint[...]
    Cette discussion est polluée par des gens qui n'ont pas compris grand chose aux tableaux structurés, aux bases de données et à la programmation, et qui s'imaginent que l'informatique, c'est de la philosophie de café de commerce où même les plus cons (surtout les plus cons) ont droit de parole et pensent que l'informatique est "relative", qu'on peut faire n'importe quoi et que toutes les idées et pratiques se valent.




    Citation Envoyé par MarcelG
    [...]Tu fais allusion, dans ce billet, à une discussion. En as-tu le lien?[...]
    En cliquant sur le bouton à droite de mon nom, tu atterris sur la discussion...

    Citation Envoyé par MarcelG
    [...]
    Ici, dans le code du formulaire, que représente "Value" en tant que paramètre des 2 Property.

    Sans doute par ignorance, j'ai du mal à m'y retrouver, surtout lorsque des mots clés de VBA sont ainsi utilisés.[...]
    Value n'est pas un mot-clé de VBA. Dans le cas présent, c'est simplement le nom de l'argument que je passe à la propriété. Pour éviter de me gratter l'occiput à trouver des noms de paramètres, j'ai décidé une fois pour toutes d'appeler Value un paramètre passé à une propriété d'un objet...

    Mis à jour 14/10/2020 à 06h51 par Pierre Fauconnier
  4. Avatar de MarcelG
    • |
    • permalink
    'ai décidé une fois pour toutes d'appeler Value un paramètre passé à une propriété d'un objet...
    Oui mais ne crois-tu que, pour la plupart des néophytes dont je suis, cette écriture puisse porter à confusion?

    Si l'objet en question est Range, cela donne

    C'est juste un avis.
  5. Avatar de Pierre Fauconnier
    • |
    • permalink
    Citation Envoyé par MarcelG
    [...]
    Si l'objet en question est Range, cela donne

    [...]
    On ne pourra jamais éviter cela à 100%. Pour moi, le principe consiste à ne pas utiliser de mots-clé VBA, ou plus généralement de mots-clé du langage utilisé. Value n'est pas un mot-clé VBA, mais la propriété d'un objet particulier d'une bibliothèque particulière, donc je n'ai personnellement aucun problème à l'utiliser comme nom de variable ou de propriété dans mes propres développements.

    Dans la mesure où je systématise mon approche et mon code autant que possible, j'ai dû faire un choix et appeler Value la valeur que l'on attribue à une propriété d'un objet ne m'a pas paru idiot ou bizarre (la preuve, c'est que les ingénieurs de MS l'on fait avec un objet Range)...

    Les appellations des procédures, fonctions, propriétés, variables (ce que sont les arguments d'une fonction), modules et classes seront toujours sujettes à caution. Certains mettent des appellations anglaises ou (mal) anglicisées, d'autres ne jurent que par le français, d'autres écrivent des abréviations dont eux-mêmes ne connaissent plus le sens lorsqu'ils se replongent dans le code six mois plus tard ...

    Le choix des uns paraîtra bizarre aux autres, et vice versa. Perso, un Value.Value ne me gêne pas, comme un range("a1").Parent.Parent pour remonter au classeur ne me gêne pas
    Mis à jour 14/10/2020 à 06h52 par Pierre Fauconnier
  6. Avatar de MarcelG
    • |
    • permalink
    D'accord, Pierre.
    A tort, je confondais Propriété et mot clé. Je voulais simplement signifier que Value fait partie du langage VBA.
    Don't Act.

    Au demeurant, cet échange sous-entend un autre sujet sur lequel je m'interroge bien souvent.
    A savoir, la dénomination des objets.
    Et je l'ai d'ailleurs maintes fois mentionné sur le forum.

    On voit trop de .

    Je préfère, et de loin, .

    Ces considérations rentrent dans un cadre général qui concerne la clarté, donc la rigueur dans la manière de coder. Voir mon dernier billet.

    Mais tout cela constitue un autre débat.

    Bonne soirée à toi.

    Et n'oublie pas la Chimée Bleue (l'autre marque, je ne m'en rappelle plus.)
    Il devrait y avoir un sous forum boissons (bières, vins, alcools...)
  7. Avatar de Pierre Fauconnier
    • |
    • permalink
    Citation Envoyé par MarcelG
    [...]

    Je préfère, et de loin, .[...]
    Nous sommes bien d'accord. J'ai pris aussi l'habitude de préfixer mes contrôles et de leur donner un nom explicite.

    Chimay bleue (ne pas abuser car c'est du costaud), c'est la brune. L'autre, la blonde un peu ambrée, c'est la Triple Karmeliet... Ne pas abuser non plus...

    Une autre, pas mauvaise du tout mais un peu plus traître pour moi, c'est la Rochefort 10 (un peu plus de 11°). Une tuerie à boire avec modération...

    Cela étant, aller en Toscane ou dans les Pouilles pour découvrir les jus de raisin de là-bas ne serait pas pour me déplaire...

    Bonne soirée et