Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

CATA56

XLDnaute Nouveau
Bonjour au forum,

Je suis toujours aussi débutant mais en progression chaque jour. Je travaille en EXCEL 2010 avec Windows 7.
Je n'arrive pas à faire une restriction de proposition de nom dans une listbox en fonction du type de contact choisi dans une COMBOBOX Liste modifiable.
Je vous joins un fichier explicatif de mon problème.
Pour résumer:
J'ai un USERFORM nommé "frmconsultcontact" qui dépend d'un onglet "BDcontact"
Dans la Liste modifiable Type : "mdrtype" j'ai 4 possibilités de choix.
Dans la Liste modifiable Société : "mdrsociete" j'ai x possibilités de noms de société qui peuvent être en doublon en fonction des choix d'affectation de type de contact.
Je ne trouve pas le code pour ma listbox "listnom" qui me permettent d'avoir uniquement les noms en lien avec les choix fait dans ses 2 COMBOBOX.
Je ne trouve pas non plus le code qui permette de sélectionner un nom dans cette listbox et qui rapatrie l'ensemble des infos de ce nom dans les autres champs de ce USERFORM.

J'ai d'autres problématiques que j'exprimerai dans d'autres fils.

J'espère avoir été suffisamment claire et je vous remercie par avance pour votre aide ou vos conseils de code.
 

Pièces jointes

  • test1.xlsm
    88.6 KB · Affichages: 92
  • test1.xlsm
    88.6 KB · Affichages: 95
  • test1.xlsm
    88.6 KB · Affichages: 104

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour Pierrot93,
Je te remercie pour l'info que j'ai déjà testé depuis quelques temps mais je n'arrive pas à l'adapter à mon besoin.
Je bloque sur le UserForm_initialize ou j'ai déjà des informations d'indiquer et je ne sais pas comment les cumuler.

Je te remercie pour ton aide si tu peux et te souhaite une bonne journée également.
@+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour Cata, Pierrot, bonjour le forum,

En supprimant les propriétés RowSource des comboboxes et de la listbox je te propose le code ci-dessous pour les alimenter (tiré en partie du site de Jacques BOISGONTIER) :
Code:
Option Explicit
Private pl As Range 'déclare la variable pl (PLage)
Private cel As Range 'déclare la variable cel (CELlule)
Private dico As Object 'déclare la variable dico (DICiOnnaire)
Private temp As Variant 'déclare la variable temp (TEMPoraire)

Private Sub UserForm_initialize() 'à l'initialisation de l'UserForm
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
With Sheets("bdcontact") 'prend en compte l'onglet "bdcontact"
    Set pl = .Range("B4:B" & Cells(Application.Rows.Count, 2).End(xlUp).Row) 'définit la plage pl
    For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
        dico(cel.Value) = "" 'alimente le dictionnaire dico
    Next cel 'prochaine cellule cel de la boucle
End With 'fin de la prise en compte de l'onglet "bdcontact"
temp = dico.keys 'récupère les éléments du dictionnaire sans doublon
Call tri(temp, LBound(temp, 1), UBound(temp, 1)) 'classement par ordre croissant
mdrtype.List = temp 'alimente la combobox "Type de Contact" par la liste sans doublon
End Sub


Private Sub mdrtype_Change() 'au changement dans la combobox "Type de Contact"
Me.mdrsociete.Clear 'vide la combobox "Société"
Me.Listnom.Clear 'vide la listbox "Nom"
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
    'si la valeur de la cellule cel est égale à la valeur de la combobox "Type de Contact", alimente le dictionnaire dico
    If cel.Value = Me.mdrtype.Value Then dico(cel.Offset(0, 1).Value) = ""
Next cel 'prochaine cellule cel de la boucle
temp = dico.keys 'récupère les éléments du dictionnaire sans doublon
Call tri(temp, LBound(temp, 1), UBound(temp, 1)) 'classement par ordre croissant
mdrsociete.List = temp 'alimente la combobox "Société" par la liste sans doublon
End Sub


Private Sub mdrsociete_Change() 'au changement dans la combobox "Société"
Me.Listnom.Clear 'vide la listbox "Nom"
If Me.mdrtype.Value <> "" Then 'condition 1 : si la combobox "Type de Contact" n'est pas vide
    For Each cel In pl 'boucle sur toutes les cellule éditées cel de la plage pl
        'condition 2 : si le type de contact et le nom de la société coïncident avec les comboboxes mdrtype et mdrsociete
        If cel.Value = Me.mdrtype.Value And cel.Offset(0, 1).Value = Me.mdrsociete Then
            Me.Listnom.AddItem (cel.Offset(0, 3).Value) 'ajoute le nom à la listbox
        End If 'fin de la condition 2
    Next cel 'prochaine cellule cel de la boucle
End If 'fin de la condition 1
End Sub


Sub tri(a, gauc, droi)
Dim ref As String
Dim g As Integer
Dim d As Integer
Dim temp As String

ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
 

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour Robert,

Je te remercie pour ce code.
Comme je le disais en préambule je suis débutant et je t'explique pourquoi.
J'essaye de passer ton code mais le premier blocage se profile au niveau du userform_initialize().
Le second est au niveau du mdrsociete_Change() qui me sert également à rapatrier les infos du choix de la société et du nom
Si je retire les miens je ne pourrai plus avoir de colonne de référence pour le rapatriement du contact.
Comment puis je détourner le problème STP.
Tu vois je suis vraiment débutant...
a+
CATA56
 

Bebere

XLDnaute Barbatruc
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

bonjour Cata,Pierrot,Robert
une bonne et heureuse année
code en partie comme Robert
changé 100000 par 10000
à bientôt
 

Pièces jointes

  • FichierCata.zip
    68.6 KB · Affichages: 52
  • FichierCata.zip
    68.6 KB · Affichages: 55
  • FichierCata.zip
    68.6 KB · Affichages: 58

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour Bebere,

Bon et heureuse année également à toi Bebere, Pierrot, robert et au Forum
Ton code marche super bien, mais il bloque à la suppression sur le mdrsociete.list = MonDico.item
Il recopie pas ma formule vers le bas en partant de la 4 ligne mais en partant de la 3°.
Je ne comprends pas tout ton code et j'ai donc du mal à voir ou cela beug.
à bientôt
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour le fil, bonjour le forum,

En pièce jointe ton fichier modifié. Tu sélectionnes le Type de Contact, puis la Société et enfin le Nom...
 

Pièces jointes

  • Cata_v01.zip
    71.2 KB · Affichages: 49

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Je te remercie Robert pour cette modification, qui fonctionne très bien sur le choix conditionnel multiple mais fait apparaître un message d'erreur après une suppression d'un contact. Le défaut se situe ici

Sub tri(a, gauc, droi)
Dim ref As String
Dim g As Integer
Dim d As Integer
Dim temp As String

ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

Malheureusement pour moi je ne comprends pas ton code et j'ai donc besoin d'une aide complémentaire.
A bientôt
CATA56 qui signifie non pas CATASTROPHE56 (quoique) mais CATAMARAN56
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour le fil, bonjour le forum,

En pièce jointe une version 2. Il y a pas mal d'erreurs sur ton fichier original comme le bouton Confirmation de l'Userform de modification frmmodifcontact qui n'avait pas de code et un code (certainement dû au copier/coller) d'un bouton Ajouter qui n'existe pas... Il manquait une ligne pour le Numéro de Contact dans le code de la Modification car tout était décalé... J'ai donc modifié certains détails. La variable li est devenue publique puisqu'elle sert à plusieurs UserForms... J'ai remplacé les Hide par des Unload pour vider la mémoire...
Je pense que ça marche mais j'ai pas tout testé...

Pourquoi 3 UserForms alors qu'une seule aurait pu suffire ?

Le fichier :
 

Pièces jointes

  • Cata_v02.zip
    77.8 KB · Affichages: 71

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

J'ai modifié ton code Robert en supprimant les tries de nom. J'espère que cela ne posera pas trop de problème le moment venu.
En tout cas, je tiens à te remercier.
Je n'ai pas trouvé de solution à mon problème via le cas de bébere mais je tiens à te remercier pour le temps que tu m'as consacré.
Merci aussi à Pierrot et au Forum.

A bientôt
CATA56
 

CATA56

XLDnaute Nouveau
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Ok merci Robert je regarde les modifications que tu as apporter. Désolé nos messages se sont croisés.
Les explications a tes questions sont très simples comme je l'ai indiqué en préambule...je débute.
Et tu as entièrement raison 1 USF au lieu de 3 c'est mieux mais je ne sais pas faire... pour le moment.
Je te remercie pour le temps passer en tout cas et je checke ton nouveau code.
A +

CATA56
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Sélection d'un nom dans une Listbox dépendant de 2 COMBOBOX Listes Modifiables

Bonjour le fil, bonjour le forum,

Je viens de me rendre compte que l'initialisation de l'UserForm de controle avec alimentation sans doublon (via un dictionnaire) plus le tri, n'était pas nécessaire et qu'on pouvait l'alimenter plus simplement avec l'onglet paramètre. Je regarde plus tard et te propose une solution simplifiée.
 

Discussions similaires

Réponses
18
Affichages
752

Statistiques des forums

Discussions
312 488
Messages
2 088 863
Membres
103 979
dernier inscrit
imed