Comment utiliser Index et Equiv dans une combobox ?

Bonjour à toutes et à tous,

Je solicite votre aide pour un problème de combobox

Je suis bloqué sur un userform avec 2 combobox : j'ai créé un tableau avec 2 listes : Managers et Collaborateurs.

L'idée est de créer 2 combobox : une qui affiche la liste des managers et l'autre qui affiche la liste des collaborateurs du manager sélectionné uniquement.

J'ai réussi à sélectionner la liste des managers dans la combobox1 mais pour la combobox2, je n'arrive pas à utiliser la fonction Index et Equiv dans VBA.

Pouvez-vous m'aider ?

Vous trouverez mon fichier en pièce jointe, cela sera peut-être plus parlant.

Merci d'avance pour votre aide et bonne soirée !!

39indexequiv.xlsm (33.97 Ko)

Bonjour

Nul besoin d'index equiv. Dans votre userform, mettez ces deux codes

1. Pour remplir la combobox1

Private Sub UserForm_Initialize()
Dim i As Byte
For i = 6 To 8
    ComboBox1.AddItem Range("A" & i)
Next i
End Sub

2. Pour remplir la combobox2

Private Sub ComboBox1_Change()
Dim lig As Byte
ComboBox2.Clear
lig = ComboBox1.ListIndex + 6
ComboBox2.List = Application.Transpose(Range("B" & lig & ":D" & lig))
End Sub

Cordialement

Bonjour Dan,

merci pour votre réponse, cela fonctionne très bien.

Le soucis c'est que si je rajoute des lignes à mon tableau, je dois modifier mon code. Je pensais qu'en utilisant index et équiv avec des listes nommées ("Managers" et Collaborateurs"), je n'aurais pas besoin de modifier le code. Y a-t-il une solution ?

Le soucis c'est que si je rajoute des lignes à mon tableau, je dois modifier mon code.

Vous rajoutez les lignes où ? à la suite de la ligne 8 ?

Oui par exemple. En fait j'aimerais avoir la possibilité de rajouter des lignes et des colonnes sans avoir à modifier le code, juste en utilisant les noms du gestionnaire de noms.

Bonjour

Comme votre tableau est construit en "Tableau structuré", vous pouvez remplacer les codes que je vous ai donné par ceux ci-dessous

1. Pour remplir la combobox1

Private Sub UserForm_Initialize()
Dim i As Byte
ComboBox1.List = Sheets("Feuil1").ListObjects("Tableau1").ListColumns(1).DataBodyRange.Value
End Sub

2. Pour remplir la combobox2

Private Sub ComboBox1_Change()
Dim lig As Byte, Dcol As Byte
ComboBox2.Clear
lig = ComboBox1.ListIndex + 6 'si première ligne de donnée à la ligne 6
Dcol = Sheets("Feuil1").ListObjects("Tableau1").ListColumns.Count
ComboBox2.List = Application.Transpose(Range(Cells(lig, 2), Cells(lig, Dcol)).Value)
End Sub

Cordialement

Bonjour …

Avec une syntaxe de base simple sans utilisation de celle réservée au tableau (ListObject) nommé TB

Option Explicit
Dim L As Integer, C As Integer
Private Sub UserForm_Initialize()
  ComboBox1.List = [TB].Columns(1).Value
End Sub
Private Sub ComboBox1_Change()
  L = ComboBox1.ListIndex + 1 'la ligne du tableau(pas de la feuille)
  C = [TB].Columns.Count – 1  'le nombre de colonnes du tableau sans la première
  ComboBox2.List = Application.Transpose([TB].Item(L, 2).Resize(, C).Value)
  Combobox2=""
End Sub

Avec une syntaxe de base simple sans utilisation de celle réservée au tableau (ListObject) nommé TB

Apparemment ce que je propose ne convient pas ?

Qu'est ce qui gêne à utiliser Listobject(tableau1) lorsqu'il est déjà nommé ?

De mon coté, j'évite les crochets qui ralentissent le code. Cette notation revient a appeler la méthode Evaluate.

Re, salut Dan

«Apparemment ce que je propose ne convient pas ? Qu'est ce qui gêne à utiliser Listobject(tableau1) lorsqu'il est déjà nommé ?»

J’ai très souvent constaté que dans la plupart des forums (ici aussi), beaucoup, dont des débutants, ignorent hélas, ces tableaux (LisObject) très performants quand on connaît leurs spécialités.

Je me suis dit que c’était peut-être dû à l’utilisation d’un vocabulaire particulier à acquérir d’abord puis à utiliser, sans faute et à bon escient, avec des expressions beaucoup plus longues à écrire et à interpréter, contrairement au vocabulaire des base (classe Range) nécessaire pour programmer.

Pour moi, sachant que Tableau1 est le nom du tableau de la classe ListObjet défini dans un quelconque onglet,

=[Tableau1].Columns(1).Value

est, sans provoquer une quelconque erreur, quand même plus facile donc simple à écrire que

=Sheets("Feuil1").ListObjects("Tableau1").ListColumns(1).DataBodyRange.Value

… mais en laissant à chacun de faire comme il l’entend (dans le sens comprend) !

Cordialement

Rechercher des sujets similaires à "comment utiliser index equiv combobox"