XL 2010 Problème de propagation d'évènement Combobox

cathodique

XLDnaute Barbatruc
Bonjour,

Ce matin je viens vers vous pour trouver une solution à ce phénomène de propagation d'évènement (c'est ainsi que @patricktoulon l'avait défini dans sa vidéo qu'il m'avait dédiée. Que je salue et remercie).

Vous l'aurez compris, j’utilise une procédure de @patricktoulon pour filtrer et ajouter des données via une combobox multicolonne.

J'explique, je saisi le nom d'une personne la combobox se filtre, si la personne est trouvée, je la sélectionne et les autres contrôles sont complétés par code (évènement click).

Sinon, je continue ma saisie et complète les contrôles à renseigner.

Le problème est le suivant: le nom Gabin est déjà enregistré, je veux ajouter Gaston à la saisie du g, dans liste de la combobox "Gabin Jean et son n°tel" apparaissent.

Je continue de saisir Gaston (plus rien dans la liste de la combobox), je saisi le prénom, l'adresse, là tout se passe bien.

Cependant, dès que je saisi le 1er chiffre du n° de téléphone, la textbox se complète avec le n° de Gabin.

Pour information, dans mon véritable fichier j'ai remarqué que le numéro de téléphone se complète toujours avec la dernière ligne filtrée de la combobox s'il y a plusieurs nom commençant par ga dans cet exemple.

J'ai eu beau mettre des espions et maltraiter ma touche F8, pour déceler ce qui déclenche ce phénomène.
Rien du tout, nada, nothing. Je n'y suis pas parvenu d'où l'ouverture de cette discussion.

Je vous remercie par avance.

nb: mon codage n'est pas au top.
 

Pièces jointes

  • Problème Propagation Evenement.xlsm
    53.1 KB · Affichages: 2
Solution
Salut,
Dans le module ComboFiltreePat, sub ci-dessous modifiée
VB:
Function ListeFiltree_2D(combo As Object, ByRef tblB, Optional Col As Long = -1)
   Dim a&, Lig, c, Tbl(), OK As Boolean, CoL1&, CoL2&, Cx&
   If combo.Value = "" Then combo.List = Array(" "): combo.Clear: Exit Function '
   If Col > UBound(tblB) Then Col = LBound(tblB)
   If Col = -1 Then
      CoL1 = LBound(tblB)
      CoL2 = UBound(tblB, 2)
   Else
      CoL1 = Col
      CoL2 = Col
   End If
   For Lig = 1 To UBound(tblB)
      OK = False
      For c = CoL1 To CoL2
         If UCase(tblB(Lig, c)) Like UCase(combo.Value) & "*" Then OK = True   'initial
         '                  If UCase(tblB(Lig, C)) Like "*" & UCase(combo.Value) Then ok = True

      Next
      If OK...

fanch55

XLDnaute Barbatruc
Salut,
Dans le module ComboFiltreePat, sub ci-dessous modifiée
VB:
Function ListeFiltree_2D(combo As Object, ByRef tblB, Optional Col As Long = -1)
   Dim a&, Lig, c, Tbl(), OK As Boolean, CoL1&, CoL2&, Cx&
   If combo.Value = "" Then combo.List = Array(" "): combo.Clear: Exit Function '
   If Col > UBound(tblB) Then Col = LBound(tblB)
   If Col = -1 Then
      CoL1 = LBound(tblB)
      CoL2 = UBound(tblB, 2)
   Else
      CoL1 = Col
      CoL2 = Col
   End If
   For Lig = 1 To UBound(tblB)
      OK = False
      For c = CoL1 To CoL2
         If UCase(tblB(Lig, c)) Like UCase(combo.Value) & "*" Then OK = True   'initial
         '                  If UCase(tblB(Lig, C)) Like "*" & UCase(combo.Value) Then ok = True

      Next
      If OK Then
         a = a + 1: ReDim Preserve Tbl(1 To UBound(tblB, 2), 1 To a)
         For Cx = 1 To UBound(Tbl): Tbl(Cx, a) = tblB(Lig, Cx): Next
      End If
   Next
   If a > 0 Then
        If a > 1 Then combo.List = Application.Transpose(Tbl) Else combo.Column = Tbl
        combo.DropDown
   Else
        combo.List = Array(" "): combo.Clear '
   End If
   'combo.DropDown ' (déplacée 4 lignes plus haut)
End Function

Dans Usf1 :
VB:
Private Sub CobNom_Change()
''stop
   If CobNom = "" Or CobNom.ListIndex < 0 Then
      TxtPrenomFa = ""
      TxtAdressFa = ""
      CobVille = ""
      TxtCP = ""
      TxtTel = ""
      TxtEmail = ""
      Txt_IdPerson = ""
   End If

End Sub
 

cathodique

XLDnaute Barbatruc
Salut,
Dans le module ComboFiltreePat, sub ci-dessous modifiée
VB:
Function ListeFiltree_2D(combo As Object, ByRef tblB, Optional Col As Long = -1)
   Dim a&, Lig, c, Tbl(), OK As Boolean, CoL1&, CoL2&, Cx&
   If combo.Value = "" Then combo.List = Array(" "): combo.Clear: Exit Function '
   If Col > UBound(tblB) Then Col = LBound(tblB)
   If Col = -1 Then
      CoL1 = LBound(tblB)
      CoL2 = UBound(tblB, 2)
   Else
      CoL1 = Col
      CoL2 = Col
   End If
   For Lig = 1 To UBound(tblB)
      OK = False
      For c = CoL1 To CoL2
         If UCase(tblB(Lig, c)) Like UCase(combo.Value) & "*" Then OK = True   'initial
         '                  If UCase(tblB(Lig, C)) Like "*" & UCase(combo.Value) Then ok = True

      Next
      If OK Then
         a = a + 1: ReDim Preserve Tbl(1 To UBound(tblB, 2), 1 To a)
         For Cx = 1 To UBound(Tbl): Tbl(Cx, a) = tblB(Lig, Cx): Next
      End If
   Next
   If a > 0 Then
        If a > 1 Then combo.List = Application.Transpose(Tbl) Else combo.Column = Tbl
        combo.DropDown
   Else
        combo.List = Array(" "): combo.Clear '
   End If
   'combo.DropDown ' (déplacée 4 lignes plus haut)
End Function

Dans Usf1 :
VB:
Private Sub CobNom_Change()
''stop
   If CobNom = "" Or CobNom.ListIndex < 0 Then
      TxtPrenomFa = ""
      TxtAdressFa = ""
      CobVille = ""
      TxtCP = ""
      TxtTel = ""
      TxtEmail = ""
      Txt_IdPerson = ""
   End If

End Sub
Bonjour @fanch55 👏👏👏👏👏

Tu es mon sauveur. Je peux t'assurer que je n'aurai jamais trouvé.
Surtout la correction dans le code de @patricktoulon.
Cela fait une semaine que je suis bloqué à cause de ce dysfonctionnement.

Merci beaucoup.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
ce n'est pas une correction c'est un besoins différent du départ c'est tout
tu cherche
quelque chose ET !! ce qui est tapé
OU !!
ce qui est tapé ET!! quelque chose

ce sont deux besoins différents ou la différence est énorme
d'ailleurs cette discussion n'a pas lieu
pourquoi:
et bien c'est simple soit tu fait une recherche par le numero soit par le nom mais pas les deux séparément sinon ça n'a aucun sens de faire un filtre sur une combo ou listbox
 

cathodique

XLDnaute Barbatruc
Bonjour @patricktoulon ,

J'espère me trompé. Il me semble que tu es un peu contrarié ou fâché contre moi.

ce n'est pas une correction c'est un besoins différent du départ c'est tout
C'est le même besoin: Filtrer une combobox. Après avoir filtré, il faut bien en faire quelque chose.
Si tu te souviens de ma question concernant une combobox à 2 colonnes (commune - cp).

tu cherche
quelque chose ET !! ce qui est tapé
OU !!
ce qui est tapé ET!! quelque chose
La combobox est à plusieurs colonnes (tu le sais. tu m'avais dit de mettre la largeur de la 1ère colonne à 0.1 pour que cela fonctionne), la recherche se fait sur la 2ème colonne sur ce qui est tapé.
Ce qui revient, si j'ai bien compris à ta 1ère suggestion (quelque chose ET !! ce qui est tapé.

ce sont deux besoins différents ou la différence est énorme
Non, c'est le même besoin. Tes fonctions m'ont bien aidé. Je t'en remercie.
Je t'en ai remercié pour toute ton aide (fonctions + vidéos explicatives).

Ensuite, je ne fais pas partie des partisans du tout cuit.
Aurais-tu adhéré à une demande pour réaliser tout mon projet?
Impossible pour moi de faire une telle demande.

et bien c'est simple soit tu fait une recherche par le numero soit par le nom mais pas les deux séparément sinon ça n'a aucun sens de faire un filtre sur une combo ou listbox
Je suis absolument d'accord avec toi. C'est bien ce que je fais. Rechercher le nom dans une combo à plusieurs colonnes (le nom est en 2ème colonne).
Si le nom est trouvé, au clic compléter les textboxs à partir des colonnes visibles ou non.
Si le nom n'est pas trouvé, je renseigne les textboxs manuellement. Tout ce passe bien sauf pour la textbox n° téléphone qui se complète au 1er chiffre tapé (0). Pourquoi???

J'ai eu beau cherché, je n'ai pas trouvé la cause. D'autant plus que tu as parlé de l'event propagation dans ta vidéo Event de propagation (9ème minute) d'où le titre de ma présente discussion.

Si tu trouves que le besoin est différent. J'en suis désolé, j'ai simplifié mon problème.

J'ai passé un bonne semaine à chercher d'où vient ce problème de complétion uniquement du numéro de téléphone (dernière textbox à renseigner) avant de me résigner à demander de l'aide.

@fanch55 (que je salue et remercie) a trouvé la faille. Tout est rentré dans l'ordre.

Je te remercie. J'ai suivi ton conseil, les fonctions sont dans ma "tire-lire".

Bonne journée.
 

patricktoulon

XLDnaute Barbatruc
bonjour @cathodique
si il y a faille comme tu dis c'est dans ton raisonnement
ma fonction listefiltree fait ce que tu lui demande
alors que tu dise plutôt j'ai un autre besoins en terme de filtrage, je comprendrais mieux

mais l'essentiel est que tu a ce dont tu a besoins
il est vrai que je réagis très mal quand on me dit que c'est pas bon si ce n'est pas justifié
je répète donc
ces deux lignes sont deux besoin différents et on une incidence très différent selon les attentes et ou le résultat escompté
VB:
 If UCase(tblB(Lig, c)) Like UCase(combo.Value) & "*" Then OK = True   'initial
         '                  If UCase(tblB(Lig, C)) Like "*" & UCase(combo.Value) Then ok = True
 

cathodique

XLDnaute Barbatruc
bonjour @cathodique
si il y a faille comme tu dis c'est dans ton raisonnement
ma fonction listefiltree fait ce que tu lui demande
alors que tu dise plutôt j'ai un autre besoins en terme de filtrage, je comprendrais mieux

mais l'essentiel est que tu a ce dont tu a besoins
il est vrai que je réagis très mal quand on me dit que c'est pas bon si ce n'est pas justifié
je répète donc
ces deux lignes sont deux besoin différents et on une incidence très différent selon les attentes et ou le résultat escompté
VB:
 If UCase(tblB(Lig, c)) Like UCase(combo.Value) & "*" Then OK = True   'initial
         '                  If UCase(tblB(Lig, C)) Like "*" & UCase(combo.Value) Then ok = True
Je suis vraiment désolé que tu aies interprété la chose du mauvais côté.
Dis-moi, juste à quel moment j'ai dit que ce n'était pas bon.

De plus comme tu le constantes, la seconde ligne de code est mise en commentaire.
C'était juste un test que j'ai fait pour mieux comprendre (on n'a pas le même niveau. et là, j'ai la nette impression que tu veux me rabaisser).

C'est ta ligne de code initiale qui s’exécute.

J'ai demandé de l'aide car j'ai eu un évènement inattendu que je ne comprenais pas.
Comme expliqué dans mon premier post. Voilà tout.

J'ai joint un fichier pour t'en rendre compte.

Je ne comprends pas ta réaction. Dans 2 de tes vidéos, tu reconnais que tu t'es trompé et tu as corrigé en direct. Nous ne sommes pas des humains infaillibles.

La ligne combo.DropDown n'était à la bonne position et c'est tout.

Au risque de me répéter, je n'ai jamais dit que tes fonctions ne donnaient de bon résultats.

Je t'avoue que ta réaction inattendue m'a vraiment retournée.

Stp, je te demande d'ignorer mes discussions à l'avenir pour éviter tout malentendu.

L'ingratitude ne fait pas partie de mon registre. Je te remercie encore une fois pour toute ton aide et le temps que tu m'as consacré.

Bonne fin d'après-midi.
 

cathodique

XLDnaute Barbatruc
Bonjour,

Le fichier du post#1 mis à jour . (pourrait servir à d'autres membres)
Finalement, @fanch55 m'a avertit en mp (suite au mien) que le problème du n° de téléphone (complétion non désirée) venait de la procédure Control_Keydown (masque de saisie) de @patricktoulon trouvée sur xld-pratique.

Bien qu'il m'ait donné sa dernière version, par omission ou étourderie j'ai utilisé l'ancien version.
C'est cette ancienne version la véritable source du problème.
Comme quoi après un certain temps on s'aperçoit qu'il manquait un petit "chouiwa" pour que ça soit juste.

Un grand merci à vous deux.

@patricktoulon : J'ai utilisé correctement tes 2 dernières fonctions. Je te remercie encore et encore.
Sans rancune. Je suis un piètre codeur et encore plus en débogage.
 

patricktoulon

XLDnaute Barbatruc
Amen ;)
N'oublie jamais ça :
si je te donne un truc ça a été testé sous toute les formes
et si il existe encore quelques incertitudes je le dit et je met en garde
là c'est pas le cas, ces deux fonctions c'est béton
tout est bien qui fini bien 👍
 

cathodique

XLDnaute Barbatruc
Attention au Calcul de l'ID qui se base sur le nombre de lignes de la table des Contacts.
C'est le meilleur moyen pour avoir des doublons et des plantages si on supprime un ou des contacts ...
Merci beaucoup. Je n'y avais même pensé.
En effet, lorsqu'une personne quitte l'association ou qu'elle ne souhaite plus accueillir un animal, on la supprime de la liste.
Je vais réfléchir à autre chose (peut-être avec la fonction Max).

Encore merci. Bonne soirée.
 

ChTi160

XLDnaute Barbatruc
Bonsoir le Fil

pas cool lol
En effet, lorsqu'une personne quitte l'association ou qu'elle ne souhaite plus accueillir un animal, on la supprime de la liste
il faudrait créer une Colonne en fin de tableau , et mettre un symbole (exemple !) sur la Ligne ou la personne quitte ou quelle ne souhaite plus accueillir un animal .
celà permettrait de conserver , pour consultation l'ensemble des personnes ayant fait partie de L'association !
Jean marie
 

Discussions similaires

Statistiques des forums

Discussions
315 089
Messages
2 116 094
Membres
112 658
dernier inscrit
doro 76