Signaler

Combobox et fonction indirect [Résolu]

Posez votre question Mimi7608 - Dernière réponse le 11 avril 2017 à 08:45 par Mimi 7608
Bonjour,

Je mets en place un petit formulaire a l'aide d'un userform dans lequel j'ai, entre autres, 2 comboboxs.

La première contient des services : donc en rowsource j'ai mis la plage nommée.

Dans la seconde doivent apparaitre les personnes appartenant au service.
Hors vba la fonction =indirect() est toute indiquée, mais là je sèche...

Merci de votre aide,


Utile
+0
plus moins
Bonsoir Mimi, bonsoir le forum,

Ton problème est relativement simple à résoudre mais il nous faudrait savoir comment sont disposées les données. Sans un fichier exemple, difficile de t'en dire plus...
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Voici le fichier : https://xls.lu/VRzC
Lorsqu'on sélectionne le service, dans la saisie d'absence je voudrais que n'apparaissent que les personnes affectées à ce service (INDIRECT).

Merci d'avance,
Donnez votre avis
Utile
+0
plus moins
Bonsoir Mimi, bonsoir le forum,

Voici la méthode que j'utilise. Elle peut paraître compliquée (variable tableau et Dictionnaire) mais elle est ultra rapide et efficace sur les gros tableaux. Surtout, elle est dynamique en récupérant les données automatiquement sans être obligé de créer des plages nommées (que j'ai supprimées d'ailleurs). Supprimé aussi la propriété RowSource de la ComboBox2...

Le code :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'décalre la variable TV (Tableau des Valeurs)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter)
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV (il vaut mieux ne pas avoir de données en-dessous...)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV (les services)
Next I 'prochaine ligne de la boucle
Me.ComboBox2.List = D.keys 'alimente la ComboBox2 avec la liste des éléments du dictionnaire D sans doublons
End Sub

Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim I As Integer 'déclare la variable I (Incrément)

Me.ComboBox3.Clear 'vide la ComboBox3
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    'si la donnée ligne I colonne 1 de TV est égale à la valeur de la ComboBox2, ajoute la donnée en colonne 2 de TV à la ComboBox3
    If TV(I, 1) = Me.ComboBox2.Value Then Me.ComboBox3.AddItem TV(I, 2)
Next I 'prochaine ligne de la boucle
End Sub


Le Fichier modifié :
http://www.cjoint.com/c/GDdttSA6pQR
Mimi 7608- 11 avril 2017 à 08:45
Bonjour ThauTheme,

Merci beaucoup pour ce code. J'ai mis du temps car débutant en vba c'est un peu complexe pour moi... J'aurais préféré quelque chose de plus simple mais excel aime bien nous triturer les méninges !

Encore merci,
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !