[Résolu] 3 ComboBox Exclusifs

Kim75

XLDnaute Occasionnel
Bonsoir le forum,

Je bloque sur l'adaptation d'une macro de suppression d'élément d'un array à une suite de 3 ComboBox s'alimentant d'une seule et même liste.

Le but est de faire en sorte que les 3 ComboBox (qui affichent une seule et même liste de valeurs) soient exclusifs, en ce sens que si une valeur est sélectionnée dans un ComboBox, elle doit disparaitre de l'affichage des 2 autres ComboBox.

Lorsque j'alimente le tableau de la manière suivante ça marche :
VB:
Tbl = Array("Allemagne", "Belgique", "Canada", "Danemark", "Espagne", "France", "Gabon", "Honduras")
Le problème est que le tableau doit rester dynamique et quand je l'alimente par la ligne de code suivante, l'erreur 9 indique que l'indice n'appartient plus à la sélection :
VB:
Tbl = Sheets("Data").Range("K2:K" & Sheets("Data").Range("K" & Rows.Count).End(xlUp).Row).Value
VB:
Sub Supprime_Element(Tbl(), num As Integer)
  Dim i As Integer
  For i = num To UBound(Tbl) - 1
  Tbl(i) = Tbl(i + 1)  '----> Erreur d'exécution 9 : l'indice n'appartient pas à la sélection
  Next i
  ReDim Preserve Tbl(i - 1)
End Sub
Ce serait sympa si quelqu'un pouvait me dire ce qui ne va pas, sans doute le type de tableau qui ne va pas, ou alors une question de réglage d'indice.

Cordialement, Kim.
 

Pièces jointes

  • ComboBox_Exclusifs_Bon.xlsm
    23.2 KB · Affichages: 42
  • ComboBox_Exclusifs_Mauvais.xlsm
    24.2 KB · Affichages: 36

Dranreb

XLDnaute Barbatruc
Bonsoir.
Pas encore ouvert un classeur. Mais je remarque 2 choses :
1) — Un tableau obtenu par la fonction Array est à une dimension basé 0, tandis qu'obtenu d'une Value de Range il est basé 1 et à 2 dimensions (1 To NbLignes, 1 To NbColonnes).
2) — La variable de contrôle d'une boucle For est en sortie de boucle à 1 de plus qu'au dernier passage. Il vaudrait mieux ReDim Preserve Tbl(UBound(Tbl) - 1) ou si basé 1: ReDim Preserve Tbl(1 To UBound(Tbl) - 1)

Pourquoi ne pouvez vous vous orienter vers un seul contrôle à sélections multiples ?

Edit: J'ai ouvert le second classeur mais je crois que je vais ouvrir le 1er dont vous prétendez qu'il marche… Parce que ça me parait plus compliqué que vous ne le croyez si toutes les ComboBox doivent toujours contenir la liste d'origine sauf les sélectionnés dans les deux autres. Là il me semble que le choix dans ComboBox1 disparait de partout, y compris dans ComboBox1.

Edit2: Ceci, uniquement dans l'userform, me paraît pas mal :
VB:
Option Explicit
Private TblSrc()
Private Sub UserForm_Initialize()
ComboBox1.List = Feuil2.[K2].Resize(Feuil2.Cells(&H100000, "K").End(xlUp).Row - 1).Value
TblSrc = ComboBox1.List
ComboBox2.List = TblSrc
ComboBox3.List = TblSrc
End Sub
Private Sub ComboBox1_AfterUpdate()
RectifierCbx
End Sub
Private Sub ComboBox2_AfterUpdate()
RectifierCbx
End Sub
Private Sub ComboBox3_AfterUpdate()
RectifierCbx
End Sub
Private Sub RectifierCbx()
ComboBox1.List = TblSrc
ComboBox2.List = TblSrc
ComboBox3.List = TblSrc
Supprimer ComboBox1.Text, ComboBox2
Supprimer ComboBox1.Text, ComboBox3
Supprimer ComboBox2.Text, ComboBox1
Supprimer ComboBox2.Text, ComboBox3
Supprimer ComboBox3.Text, ComboBox1
Supprimer ComboBox3.Text, ComboBox2
End Sub
Private Sub Supprimer(ByVal Text As String, ByVal CBx As MSForms.ComboBox)
Dim Svg As String
Svg = CBx.Text
CBx.Text = Text
If CBx.MatchFound Then CBx.RemoveItem CBx.ListIndex
CBx.Text = Svg
End Sub
 
Dernière édition:

Kim75

XLDnaute Occasionnel
Pourquoi ne pouvez vous vous orienter vers un seul contrôle à sélections multiples ?
Bonsoir Dranreb, et merci de t'être penché sur le classeur :)

Ton code est tout à fait fonctionnel, c'est vrai que c'est pas courant de vouloir utiliser 3 ComboBox pour une seule et même liste de valeurs, mais c'est pour filtrer une ListView de sorte que les valeurs sélectionnées ajoutent au lieu d'exclure les lignes en question.

Le classeur joint illustre bien le but recherché, je ne sais pas si c'est bien fait, mais c'est ce à quoi j'ai pensé, en tout cas ça a l'air de fonctionner. En fait, si je voulais rester avec les tableaux, c'était parce que ce serait une solution "générique" utilisable dans d'autres contextes.

Cordialement, Kim.
 

Pièces jointes

  • ComboBox_Exclusifs_Bon.xlsm
    44.2 KB · Affichages: 48
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Si vous voulez des choses que vous pouvez utiliser dans d'autres contextes j'en ai plein.
Notamment un module qui vous permettrait de retrouver instantanément dans un Dictionary des Type classés sans doublon les numéros dans les Data des lignes qui y correspondent. (Voire dans un Variant, et non un Dictionary)
Mais d'abord vous auriez intérêt à améliorer l'alimentation de la ListView à partir d'un tableau préalablement initialisé par chargement en une seule instruction de la totalité. Ce serait beaucoup plus rapide.
 
Dernière édition:

Kim75

XLDnaute Occasionnel
Bonsoir Dranreb :)

Ta version c'est du pro, merci beaucoup et chapeau :) Je vois que tu as alimenté le ListView via un tableau,
J'ai suivi ton conseil et alimenté dans la première version le ListView via un tableau avec attribution de clés,

Cordialement, Kim.
 

Pièces jointes

  • ComboBox_Exclusifs_Bon.xlsm
    42.7 KB · Affichages: 51
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 180
Messages
2 085 995
Membres
103 082
dernier inscrit
adri77