Une liste commune à plusieurs ComboBox

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

J'ai une liste de produits divers que je peux enrichir à ma guise.
Supposons, qu'à un moment donné, il y ait dans cette liste :

Huile de croton
Huile de sésame
Huile de ricin
Glycérine
Propylène glycol
Bave de crapaud
Septisol
Extrait d'aloès
Larmes de crocodile

Sur la feuille il y a plusieurs ComboBox, supposons 4 (mais il se peut que par la suite j'en rajoute).
Chacune de ces ComboBox puise sa source dans la liste ci-dessus.
Je choisis un item dans la 1ère ComboBox : cet item disparaît de la liste des autres ComboBox (2, 3 et 4).
Je choisis un item dans la 2ème ComboBox : cet item disparaît de la liste des autres ComboBox (1, 3 et 4).
Et ainsi de suite.
Supposons maintenant que je décide de choisir un autre item dans la liste de la 1ère ComboBox.
L'item précédemment choisi dans cette liste réapparaît alors dans les listes des autres ComboBox.
En somme, faire en sorte qu'il soit impossible de choisir par inadvertance plusieurs fois un même item.

Merci d'avance pour l'aide.
 
Re : Une liste commune à plusieurs ComboBox

Rebonsoir BOISGONTIER,

C'est presque parfait. Mais supposons que l'on veuille faire marche arrière, c'est-à-dire revenir sur un ComboBox (par exemple le 1er) pour rectifier le choix. Dans sa liste figure toujours les items des 2 autres ComboBox. L'idéal étant que chaque fois que l'on choisit un item dans la liste d'un ComboBox, cet item disparaisse des listes des autres ComboBox, et si l'on rectifie le choix, non seulement le nouveau choix disparaîtra des listes des autres ComboBox, mais le précédent choix sera alors réintégré dans les listes des autres ComboBox. Ainsi on est sûr d'éviter de sélectionner par inadvertance plusieurs fois le même item et d'éventuellement revenir sur sa sélection en pouvant choisir tous les items encore disponibles.
 
Re : Une liste commune à plusieurs ComboBox

Bonjour,

Voir pj

Code:
Dim liste, n
Private Sub UserForm_Initialize()
    n = 4
    creelistedispo
End Sub

Sub creelistedispo()
  Set f = Sheets("BD")
  Set liste = CreateObject("Scripting.Dictionary")
  For Each c In f.Range("a2:a" & f.[a65000].End(xlUp).Row).Value
    liste(c) = ""
  Next
  For i = 1 To n
    If Me("combobox" & i).Value <> "" Then liste.Remove (Me("combobox" & i).Value)
  Next i
  For i = 1 To n: Me("ComboBox" & i).List = liste.keys: Next
End Sub

Private Sub ComboBox1_Click()
  creelistedispo
End Sub

Private Sub ComboBox2_Click()
  creelistedispo
End Sub

Private Sub ComboBox3_Click()
  creelistedispo
End Sub

Private Sub ComboBox4_Click()
  creelistedispo
End Sub

JB
 

Pièces jointes

Re : Une liste commune à plusieurs ComboBox

Bonjour BOISGONTIER,

Tout d'abord merci pour ta diligence et ton efficacité. C'est impécable !
Ce n'est pas que je veuille être plus royaliste que le Roi, mais dans ma feuille je ne voudrais avoir que des ComboBox et ne pas avoir à faire appel à un USF pour y accéder.
En conséquence j'ai d'abord essayé de comprendre tes routines qui, je dois l'avouer, me sont encore en partie obscures, par exemple le très mystérieux Set liste = CreateObject("Scripting.Dictionary").
J'ai tenté de les modifier afin de court-circuiter l'USF et là CATA plus rien ne marche (le contraire m'aurait franchement étonné, vu mon niveau !).
Je joins le classeur avec son unique feuille modifiée.

Mais encore une fois merci.
 

Pièces jointes

Re : Une liste commune à plusieurs ComboBox

Re,

Super !

Comme Set f = Sheets("BD"), je me suis permis d'alléger la macro. Mais ai-je bien fait ? Bon, en tout cas ça marche.
Aimant bien Option Explicit, je suis bien obligé alors de déclarer toutes les variables. Pour f j'ai écrit :
f As Sheets --> ça ne marche pas
f As Object --> ça ne marche pas
Comment donc déclarer f ?

Enfin, derniers points de détail.
1/ Quand on ouvre le classeur, automatiquement les listes des ComboBox sont réinitialisées et en conséquence, par défaut, une case vierge est sélectionnée. Comment s'y prendre pour qu'à l'ouverture du classeur tous les derniers items sélectionnés des ComboBox (avant fermeture précédente du classeur) soient toujours sélectionnés ?
2/ Quand on choisit un item dans un ComboBox, il reste toujours une case vide en fin de liste. Comment y remédier afin qu'un étourdi ne la sélectionne par inadvertance ?
 

Pièces jointes

Re : Une liste commune à plusieurs ComboBox

Voir pj

JB
 

Pièces jointes

Dernière édition:
Re : Une liste commune à plusieurs ComboBox

Salut Magic_Doctor 🙂, Jacques 🙂, le Forum

Le fichier de JB modifié selon ton besoin si j'ai bien compris

Il suffit de définir un Nom ListeItems3 Par exemple et d'y coller cette formule

Code:
=DECALER(ListeItems2;;;SOMME((ListeItems2<>"")*1))
et dans le code de Jacques remplacer

Code:
  For Each c In f.Range("B4:B" & f.[B65000].End(xlUp).Row).Value
    liste(c) = ""
  Next
par

Code:
  For Each c In F.Range("ListeItems3").Value
    liste(c) = ""
  Next
EDITION: @ JB... y-a-t'il une explication particulière pour continuer à utiliser Sub auto_open() en lieu et place de Private Sub Workbook_Open() 🙂
Bonne Journée
 

Pièces jointes

Dernière édition:
Re : Une liste commune à plusieurs ComboBox

Bonjour,

>il persiste toujours un dernier item vide.Peut-on l'éviter ?

Code:
  For Each c In f.Range("B4:B" & f.[B65000].End(xlUp).Row).Value
   If Len(c) > 0 Then liste(c) = ""   ' ne prend pas les cellules vides
  Next

>y-a-t'il une explication particulière pour continuer à utiliser Sub auto_open() en lieu et place de Private Sub Workbook_Open()

Non.

Code:
Sub auto_open()
  creelistedispo
End Sub

Sub creelistedispo()
  Set f = Sheets("BD")
  Set liste = CreateObject("Scripting.Dictionary")
  For Each c In f.Range("B4:B" & f.[B65000].End(xlUp).Row).Value
    If Len(c) > 0 Then liste(c) = ""
  Next
  For Each c In f.OLEObjects
    If TypeName(c.Object) = "ComboBox" Then
     If c.Object <> "" Then liste.Remove c.Object.Value
    End If
  Next c
  For Each c In f.OLEObjects
    If TypeName(c.Object) = "ComboBox" Then c.Object.List = liste.keys
  Next c
End Sub

JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

L
Réponses
9
Affichages
1 K
le feuvre
L
R
Réponses
8
Affichages
1 K
Romane.
R
Retour