XL 2019 Combobox en conflit

SPGoder

XLDnaute Occasionnel
Bonjour
Je viens de me lancer dans une adaptation d'un programme en VBA pour de la gestion immobilière d'un fichier trouvé sur le net.
Mon niveau programmation est très faible, mais c'est le moment de s'y mettre.
J'ai réussi à faire pas mal de modif, mais je bute sur un point. Comme annoncé dans le titre, j'ai l'impression que le 2combobox rentre en conflit (Combox1 "code" et Combobox3 "Nom")
CAD: pour la fiche bailleur (c'est la même chose pour les autres) lorsque que l'on crée 2 bailleurs avec le même nom (homonyme donc), la recherche dans les combobox revient sur le premier enregistrement lorsque l'on sélectionne le 3ieme par exemple (pas facile d'être clair)
Après moult recherches et essai, je me tourne vers vous.
Je pense que le problème viens de ComboBox1_Change() (Combobox "code")
J'ai essayé
-de mettre la propriété du combobox MatchEntry=fmMatchEntryNone ou fmMatchEntryFirstLetter, mais toujours la même chose.
- de changer ComboBox1_Change() par ComboBox1_afterupdate(), mais ça ne fais plus ce que je désire
- d'insérer Application.EnableEvents = False et Application.EnableEvents = True autour du code la procédure Private Sub ComboBox1_Change(), même problème
Pour constater le problème, ouvrir bailleur, et dans code sélectionner PR0002, puis PR0003 et là, il affiche PR0001 au lieu de PR0003 (car ceux sont des homonymes)
Je remercie par avance la bonne âme qui pourra m'aider (presque 2 jours de recherche et d'essais infructueux).
Le fichier étant trop volumineux, je mets le lien pour le télécharger (du coup l'original) http://dl.free.fr/kcgpTeXTs
et je joins une page à recopier dans la feuille bailleur (pour vous évitez la saisie)
Je reste dispo pour tout renseignement que vous auriez besoin
 

Pièces jointes

  • Classeur test.xlsx
    9.8 KB · Affichages: 15

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @SPGoder , le Forum

Je suis arrivé à simuler ton problème.
Si tu ajoutes une simple MsgBox dans :

VB:
 Private Sub ComboBox1_Change()
    Dim Ligne As Long, I As Integer
MsgBox ComboBox1.ListIndex + 2
'etc..........'

Tu verras ceci :
SPGoder.gif


C'est dû à cet enchevètrement de ComboxBox_Change qui vont chacun remettre à jour les autres ComboxBox... C'est "normal" car le changement par VBA est pris par l'évènement de la même manière que lorsque qu'on click manuellement sur une ComboBox.

Pour bypasser ce problème, il faut empécher la mise à jour intempestive des ComboBox entres elles avec un "Verrou" boolean , mais comme il y en a plusieurs en cascades ca va être coton...
Pour que ca marche, il faudrait aussi qu'une fois les choix faits par l'utilisateur, il ne puisse plus changer les ComboBoxs dans un autre ordre...

Ou bien une autre idée c'est aussi d'avoir une colonne "cachée" dans les ComboBox contenant le numéro de ligne de la feuille... Il y a du travail...

Bon courage
@+Thierry

(PS En tout cas les pistes que tu mentionnes (EnableEvent, MatchEntry etc, etc, non ca ne donnera rien)
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonsoir

Tant que j'avais le fichier sous les yeux, et si c'est acceptable niveau présentation, on peut aussi bricoler un petit truc simple sans avoir à tout refaire le concept :

Dans l'Initialse de l'USF :
VB:
    With ComboBox3
        For Var2 = 2 To Ws.Range("C" & Rows.Count).End(xlUp).Row
           .AddItem Ws.Range("C" & Var2) & " - " & Ws.Range("C" & Var2).Offset(0, 1)
        Next Var2
    End With

Dans le ComboBox1_Change :
Code:
 ComboBox3 = Ws.Cells(Ligne, "C") & " - " & Ws.Cells(Ligne, "C").Offset(0, 1)

Là ca à l'air de passer :
SPGoder.gif


Bonne soirée
@+Thierry

PS pour les déclarations de Variables "Peut mieux faire" ;)
 

SPGoder

XLDnaute Occasionnel
Merci pour votre réponse
Je me doutais bien que l'imbrication des combobox entre eux pose problème.
La solution que vous proposez est acceptable, mais se pose le problème si ils ont le même prénom aussi. Pour la partie bailleur, je ne pense pas car c'est moi, mais pour les locataires.....
Après, je peux compter sur le hasard de la vie, mais j'aime bien les choses carrés, où on anticipe les problèmes.
Je vais réfléchir à tout ça, surtout avec une colonne cachée, je pense qu'il y a moyen. Genre je mets un numéro devant le nom de locataire dans combobox3 (tel que vous le proposez avec nom et prénom) et comme cela, je pourrais considérer que ça me compte le nombre de locataires depuis l’acquisition.
Encore merci pour votre temps et vos réponses
 

SPGoder

XLDnaute Occasionnel
Après essai, cela fonctionne presque
Voici ce que j'ai fait:
-Création d'une colonne supplémentaire dans la feuille bailleur avec le numero de l'enregistrement par ligne (pour 6 enregistrement, 1.2.3.4.5.6)
- Modification du code tel que tu me l'as proposé
Du coup dans le combox3, cela s'affiche au format "1 - Nom", "2 - Nom" etc...
Plus de problème avec le combobox1

Souci, quand on veut faire une modification, cela enregistre avec le nom avec le numéro...
Cela serait-il possible qu'au moment de l'enregistrement (CommandButton2_Click()), il ne prenne les caractères qu'après le deuxième espace (pour éviter les problèmes dès que le chiffre passe au dizaine, voir centaine)

et dans l'idéal, plutôt que de rajouter une colonne, pourquoi ne pas se servir du nombre qui compose le code (pour PRO0001, prendre 1, pour PRO0010, prendre 10 etc...) pour le lié au nom?
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @SPGoder , le Forum

Oui c'est assez simple à modifier, par contre pas en Prefix, mais en Suffix.... Car sinon si tu cherches "Dup" dans ta ComBox3 tu perdras ce bénéfice automatique du filtre d'une ComboBox...( j'aime bien aussi les choses carrées, où on anticipe les problèmes ;))

UserForm_Initialize
VB:
    With ComboBox3
        For Var2 = 2 To Ws.Range("C" & Rows.Count).End(xlUp).Row
           .AddItem Ws.Range("C" & Var2) & "_" & Ws.Range("A" & Var2)
        Next Var2
    End With


Private Sub ComboBox1_Change()
VB:
ComboBox3 = Ws.Cells(Ligne, "C") & "_" & Ws.Cells(Ligne, "A")

Private Sub CommandButton2_Click()
VB:
Dim Container As Variant
'.........'
        Container = Split(ComboBox3, "_")
        Ws.Cells(Ligne, "C").Value = Container(0) ' Nom (sans le suffix "PR0000x)

Ce devrait le faire... On s'en fiche de mettre PR00001 au lieu de 1, ce n'est que visuel après le nom, car sinon ca va encore compliquer le code... (pour 1, 10, 100 etc...), l'important c'est le séparateur "_" le reste on ne calcul pas.

Bien à toi, à vous
@+Thierry
 

SPGoder

XLDnaute Occasionnel
Je vais garder ma colonne de numéros dans la feuille bailleurs, et faire apparaitre le numéro en premier dans les combobox, je préfère, purement esthétique à lire.
Pour le code
Du coup j'ai adapté la dernière partie en :
Code:
Dim Container As Variant
'.........'
        Container = Split(ComboBox3, " _ ")
        Ws.Cells(Ligne, "C").Value = Container(1)

ou
Code:
Dim Container As Variant
'.........'
        Container = Split(ComboBox3, " _ ")(1)
        Ws.Cells(Ligne, "C").Value = Container
Ce qui doit revenir au même je pense
Je vous remercie, et compte tenu de toute les modifs que je m’apprête à effectuer (certaines sont déjà en place), je ne serais pas étonné de revenir poser quelques questions
Bonne continuation
 

Discussions similaires

Réponses
28
Affichages
1 K

Statistiques des forums

Discussions
312 231
Messages
2 086 438
Membres
103 208
dernier inscrit
Natsu09