faire un tri préalable à l'affichage dans un Combobox

poups

XLDnaute Occasionnel
Bonjour,
Je solicite votre aide

J'aimerais effectué un tri dans le combox2 (UserForm1) en fonction du choix réalisée dans le combobox1 choix relatif aux colones SAV dans une feuille qui doit correspondre à la colone usine dans l'autre.

Ainsi cela me permétrais d'affiché par défaut un nom et le cas échéant pouvoir choisir un autre interlocuteur dans la même usine.

J'éspère avoir été clair ...
Merci d'avance

Poups
 

Pièces jointes

  • ESSAI_SFF2013.xlsm
    42.4 KB · Affichages: 248

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
1er point (pour CbxNomTCS je suppose et non CbxTCS qui ne sert à rien, j'y reviendrai), facile, après CLTCS.Actualiser :
VB:
Randomize
   CbxNomTCS.ListIndex = Int(Rnd * CbxNomTCS.ListCount)

Point 2 c'est plus difficile parce que je suis tout le temps obligé de planter Excel parce qu'on ne peut plus interrompre l'exécution par Ctrl+Pause ni Echap. Qu'est ce que vous avez encore fabriqué ???.

Au lieu de 3 boutons BT_Init tour à tour masqués ou visibles, il serait plus simple de n'en avoir qu'un avec un Select Case Me.MultiPage1.Value dans sa procédure Click. Ça simplifierait cette procédure:
VB:
Private Sub MultiPage1_Change()
Me.BtnEffacer.Visible = Me.MultiPage1.Value <> 2
End If
Vos ComboBox fictifs (qui sont en fait réels mais escamotés) ne me plaisent pas du tout.
Je préfère équiper ComboxLiés d'un dispositif permettant de les prendre en compte sans avoir à définir de vrai ComboBox.
D'ailleurs je crois que c'est absolument indispensable. Il y en a au moins un qui est même utilisé par plusieurs ComboBoxLiés. C'est épouvantable parce qu'il peut changer sans crier gare et provoquer des appels récursifs réciproques entre les deux qui ne peuvent plus conclure. C'est d'ailleurs probablement ce qui se passe, je ne sais pas, c'est impossible à suivre.
J'ai déjà une idée de la façon de procéder. La méthode sera probablement:
Public Sub Filtrer(ByVal Valeur As Variant, ByVal Colonne As Variant)
Elle pourra être spécifiée parmi les Add, ou ailleurs, mais devra être suivie d'un Actualiser pour être prise en compte.

P.S. Ça ne va pas du tout. Supprimez vous même tous les combobox factices. Et qu'il soit factice ou non, interdiction pour vous d'utiliser un même ComboBox dans plusieurs ComboBoxLiés. Et ne modifier jamais un ComboBox dans un Bingo sauf si vous êtes absolument sûr que ça ne se mord pas la queue ! Ou alors Stoppez d'abord Son ComboBoxLiés puis Activez le ensuite. Deux méthodes permettent ça, encore qu'elle ont plus été conçues pour permettre aux ComboBox de fonctionner en champs de saisie dans une application où un même onglet pouvait fonctionner en mode Recherche ou en mode Fiche.
Je le joins comme il est, je n'arrive pas à le mettre au point, je me suis de nouveau fait avoir, Excel ne répond pas, je vais être obligé de le planter.
La nouvelle méthode Filtrer que j'ai ajoutée ne devrait pas présenter le même danger: elle n'a aucune action sur les ComboBox : elle ne prend effet qu'au moment d'une ré-exécution du Actualiser. Plusieurs filtres devraient pouvoir être demandés sur des colonnes différentes (c'est pourquoi je n'ai pas assumé ce Actualiser). Ça poserait toutefois un problème si leur combinaison inexistante vidait la liste de ceux à retenir. Veillez quand même à ne pas implanter ce filtrage de façon mutuelle entre différents ComboBoxLiés sinon on ne s'en sort de nouveau plus ! Ne m'obligez pas à vous obliger à Stopper tous les ComboBoxLiés dans leurs BingoUn !
 

Pièces jointes

  • Trame_SFF2013-5.xls
    436 KB · Affichages: 76
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour Dranred,
J'ai modifié le fichier, J'ai supprimé les Cbx Factice et supprimé Combobox lié qui pouvait généré le plantage des tablesIdex
La fonction Filtre ne semble pas marcher ? (j'en ai laisé qu'une sur "TCI")
Y a t'il encore des choses anormales ?

HTML:
Private Sub MultiPage1_Change()
 Me.BtnEffacer.Visible = Me.MultiPage1.Value <> 2
 End If
Peux tu m'expliquer ce code comment il s'articule sur le BtnEffacer ?

Sur un autre sujet, j'ai fait un fichier "Essais Table" un Userform et juste un ComboboxLiée (cela devrais marcher)
Pour la consultation / modification / ajout de nouvelle entrée
J'ai essayé un truc pour l'enregistrement d'une nouvelle entrée mais cela ne marche pas
Par contre j'ai vu des fonctions qui peuvent tres certainement être intérésante dans tes modules de bases
Ai-je bien lu et comment utilisé les fonctions ?

Merci beaucoup j'espère que tu ne perd pas pacience
Poups
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
Je vais reprendre les tests pour mettre au point la méthode Filtre
Cette instruction n'afficherait le bouton unique qu'à cette condition, ce en quoi peut être vue une comparaison, laquelle constitue toujours une expression Boolean valant donc True ou False. À ce propos n'utilisez pas les opérateurs de comparaisons numériques ou chaînes pour comparer des expressions Boolean. Utilisez Eqv à la place de = et Xor à la place de <>. Et ne comparez jamais, que ce soit comme condition dans des If ou ailleurs, des expressions Boolean (supposons tel X) à des constantes Boolean. C'est toujours idiot car X Eqv True vaut toujours X, n'est ce pas, et X Eqv False vaut toujours Not X. Donc faites If Not X Then et non pas If X = False Then, car ça c'est fondamentalement absurde aux deux égards. En somme, si vous voulez, un Boolean est souvent déjà en soit un résultat de comparaison, il n'y a plus lieu de le recomparer à quoi que ce soit, sauf à le combiner éventuellement par des opérateurs logiques And, Or, Xor, Eqv, Imp et Not à d'autres expressions logiques.
Bon. Après ce cours de philosophie formelle, je vais examiner tes fichiers.

P.S. Suite à un rapide test sur le classeur modèle de mise à jour à développer, vu pourquoi Filtrer reste sans effet: il manque cette instruction juste avant le End Sub de la méthode Filtrer :
VB:
Préfiltré = True

Et voici un modèle de mise à jour possible, assez complet.

L'autre classeur m'oblige toujours à planter Excel, mais je ne suis plus sûr du genre de cause qu'il faut y voir. Ça se produit aussitôt que j'essaye d'afficher l'userform pour la seconde fois. Enfin, avec l'ajout de l'instruction indiquée plus haut, le filtre marche désormais. Il ne vous reste plus qu'à l'utiliser lorsque vous voulez modifier le contenu pris en compte par un autre ComboxLiés et ré-exécuter aussitôt son Actualiser. Veillez bien cependant à ce qu'aucun ne fasse la même chose sur celui qui a commencé, même via un troisième.
A +
 

Pièces jointes

  • Essais Base.xls
    252 KB · Affichages: 117
  • Essais Base.xls
    252 KB · Affichages: 130
  • Essais Base.xls
    252 KB · Affichages: 127
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour Dranred,
Je n'avais pas vu que tu avais répondu (en faite tu as modifié ton dernier message du cout je n'est pas reçu de notification) Merci beaucoup pour ton travail, c'est exactement ce que voulais

Il y a plus cas, je mis cramper dans le week-end !

J'ai eu un petit PB pour mettre à jour la méthode filtrée, dans le module de classe,
En faite j'utilisais un ancien fichier et la méthode filtrer n'existait pas et d'autres modifs non plus d'ailleurs ...
Je pense avoir bien fait, je verrais quand je ferais les modifs sur mon fichier si cela marche
Dans tous les cas cela fonctionne sur le fichier que je t'aie renvoyé ...

Je ne suis pas contre utilisée ComboBoxCasc, suffit il de remplacer ComboBoxliées par ComboBoxCasc ?
Sinon si cela marche bien comme cela, je ne vais pas m'embêter ...
Pour les combobox et leur ordre hiérarchique je pense simplifié 1 à 2 combobox doivent suffire pour mettre à jour, les bases sont simple

Pour l'image cela marche chez moi avec une image sur un serveur, je vais quand même regarder, mais je n'ai encore vu comment tu avais fait

Mon dernier PB est le Formats des textes (n° de téléphone) entre autres qui n'est pas respecté entre Excel et l'USERFORM le 0 en t^te disparait ... je ne ce n’est pas géré les Formats ?
J’aimerais d’ailleurs interdire les modifications dans l’userform courant et obliger les gens a faire les modifications les userform dédiés est ce possible ?

Encore un grand merci pour ton aide

Poups
 

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour
Je ne suis pas contre utilisée ComboBoxCasc, suffit il de remplacer ComboBoxliées par ComboBoxCasc ?
Oui, en gros, le démarrage est pareil. Mais il n'y a pas d'évènement Change, il faut utiliser Défait. Mais du coup ça implique de mettre ailleurs le versement des Combobox dans VLgn quand la ligne courante est à 0, pour une création. Ça devrait pouvoir se faire au dernier moment, dans la procédure du bouton valider.
J'ai indiqué mon avatar dans fenêtre de propriété, pour l'image, propriété Picture (bouton "…" qui apparait à droite quand on sélectionne cette propriété)
Le problème des numéros de téléphone ne se produit pas sur ceux déjà enregistrés en tant que textes et n'utilisant pas le format de la cellule. Si vous voulez qu'ils soient affichés sans espaces et enregistrés en tant que nombres par l'userform,
dans GarnirChamps:
VB:
Me.TB_Tel = Format(VLgn(1, 5), "0000000000")
Dans HabiliterContrôles:
VB:
If CDbl(Me.TB_Tel) <> VLgn(1, 5) Then GoTo ÇaAChangé
Dans BtnValider_Click:
VB:
VLgn(1, 5) = CDbl(Me.TB_Tel)
Mais homogénéisez d'abord dans la base tous les numéros de téléphone en tant que nombre et non texte. Si vous voulez qu'ils soient affichés avec des espaces mais enregistrés en tant que nombres, c'est un peu plus compliqué, j'écrirais une paire de procédures Property pour ça.
Il y a aussi un problème avec les codes postaux. Certains sont en String d'autres sont en Double.
Et il y a un problème plus sérieux d'exécution de HabiliterContrôles à tort induites par GarnirChamps. C'est vraiment une grave connerie de Microsoft de n'avoir pas fait en sorte que dans quelque contexte que ce soit une exécution de procédure évènement ne puisse jamais être induite involontairement par une exécution de code !
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Je re-joins le classeur dans ce nouveau message (pour que vous en soyez notifié) avec quelques ajustements, et des ajouts surtout dans le module Utilit.


Edit: mais j'y ai déjà réécrit ces deux procédures :
VB:
Rem. —— Conversions particulières dans les deux sens de données non String en valeurs de contrôles

Property Get Téléph(Vlgn(), ByVal Col As Long) As String
If IsEmpty(Vlgn(1, Col)) Then Téléph = "": Exit Property
If IsNumeric(Vlgn(1, Col)) Then Téléph = Format(Vlgn(1, Col), "0000000000"): Exit Property
Téléph = Replace(Vlgn(1, Col), " ", "")
End Property
Property Let Téléph(Vlgn(), ByVal Col As Long, ByVal Txt As String)
If Txt = "" Then Vlgn(1, Col) = Empty: Exit Property
On Error Resume Next: Vlgn(1, Col) = CDbl(Txt)
If Err Then Vlgn(1, Col) = Txt
End Property
'

Property Get CoPost(Vlgn(), ByVal Col As Long) As String
If IsEmpty(Vlgn(1, Col)) Then CoPost = "": Exit Property
If IsNumeric(Vlgn(1, Col)) Then CoPost = Format(Vlgn(1, Col), "00000"): Exit Property
CoPost = Vlgn(1, Col)
End Property
Property Let CoPost(Vlgn(), ByVal Col As Long, ByVal Txt As String)
If Txt = "" Then Vlgn(1, Col) = Empty: Exit Property
On Error Resume Next: Vlgn(1, Col) = CDbl(Txt)
If Err Then Vlgn(1, Col) = Txt
End Property
 

Pièces jointes

  • Essais Base.xls
    310 KB · Affichages: 86
  • Essais Base.xls
    310 KB · Affichages: 120
  • Essais Base.xls
    310 KB · Affichages: 123
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour et merci, je ne suis pas encore passé a cet étape, je veux faire marcher parfaitement le reste avant
Mais c'est pour bientôt ....

J'ai lu dans le module "Fitrer"
' Colonne : La colonne dans la plage. Ce peut être un Range, un numéro de colonne, une lettre de colonne, un nom de plage.

Avec un n° / une lettre pas de Pb ca marche, je me suis dit si j'utilisais un "Range"
J'ai essayé un truc comme cela :

Dim XXX as Range
XXX = Label1

With FDonSAV
Set PlgSAV = .[A2:M2].Resize(.Cells(.Rows.Count, "A").End(xlUp).Row - 1): End With
Set CLSAV = New ComboBoxLiés
'Set SAVUsine = LabVSAV
CLSAV.Plage PlgSAV
CLSAV.Add Me.CbxNomSAV, "B"
CLSAV.Filtrer XXX, "H"
CLSAV.Actualiser

Bien évidement cela ne marche pas, y a t'il un truc à faire ?
Sinon c'est pas grave c'était pour améliorer les choses
Bon apres midi
Pous
 

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
Quel pataquès votre tentative !
D'abord une variable déclarée As Range représente un objet, elle ne peut donc pas être utilisée avant d'avoir été définie par un Set ou dans un For Each … In …
Oui, vous avez bien lu mais comme pour Add, ça concerne le second paramètre, non le premier. Notez qu'on utilise déjà partout ailleurs des numéros de colonnes dans VLgn. Peut être devrait on aussi utiliser ces numéros dans les Add et les Filtrer plutôt que leurs lettres.
Je rappelle que, au contraire des Add, les Filtrer devrait aussi pouvoir être utilisé ailleurs que dans l'Userform_Initialize, si c'est pour une valeur qui peut changer. Le tout c'est de ne pas oublier de refaire derrière un Actualiser du CBL concerné pour que ce soit pris en compte. Ça devrait pouvoir se faire dans un BingoUn d'un autre CBL. À condition toujours qu'il ne soit pas lui même l'objet de cette manœuvre dans celui du premier, sans cela on ne s'en sort plus !

Bonne fin d'après midi.
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour Dranred,
Je suis désolé de te resolicité, mais manifestement je n'ai pas encore tous compris dans la gestion des bases
Et temps que je n'ai pas compris je ne peux pas reproduire ....

J'ai tenté de refaire la gestion d'une base sans résultat (avec ton modèle)
Donnees_sav1 c'est l'USERFORM dont tu as refait le VB
Donnees_sav c'est le mien modifié et normalement simplifié (moins de COMBOBOX)
J'ai fait un autre test sur une autre basse avec moins d'éléments sans plus de résultat
La "clé" est obligatoirement un Combobox ?

Par contre l'affichage de BT actif sur condition super
Format automatique TEL CP super => je vais utilisée ça sur mon USERFORM Principal
L'image dans les propriétés OK, mais cela fait une image par userform donc le fichier est plus gros en taille, par rapport à ma solution à réfléchir

Je dois faire une présentation demain de l'avancement partiel de mon projet, ce n’est pas gagné je pense que je vais y passer la nuit ...

Merci de ton aide
Poups
 

Pièces jointes

  • Essais Base.xls
    306 KB · Affichages: 81
  • Essais Base.xls
    306 KB · Affichages: 77
  • Essais Base.xls
    306 KB · Affichages: 78

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
Donnees_sav c'est le mien modifié et normalement simplifié (moins de COMBOBOX)
Je suis en train de tenter F5 sur l'userform, je tombe sur un nom de contrôle qui n'existe pas: Me.TB_TB_RatSAV avec répétition accidentelle de "TB_" dedans. Ce n'est quand même pas cela qui t'arrête ? Pendant qu'il est arrêté dans HabiliterContrôles avec ça je vais déjà répondre au reste.
La "clé" est obligatoirement un Combobox ?
Comprend pas le sens de la question dans ce contexte. Dans un autre éventuel, si c'est une clé de filtrage à l'aide de la méthode Filtrer puis Actualiser je dirais plutôt que ce ne doit pas être un ComboBox
L'image dans les propriétés OK, mais cela fait une image par userform donc le fichier est plus gros en taille, par rapport à ma solution à réfléchir
Ça ce n'est pas faux ! Éventuellement essayer de mettre l'image sur un seul et affecter sa Picture aux Picture des autres. Faire attention à la nature de l'image. Un .gif à palette peut prendre moins de place qu'un .jpg.

Après poursuite de l'exécution, vu qu'il manque la CLSAV_BingoUn pour récupérer la ligne existante. Rappel : Sélectionner CLSAV au dessus à gauche et BingoUn au dessus à droite (vues et utilisées, ces listes déroulantes qui surmontent la fenêtre de code ?)

Je reviens sur le CbxCleSAV, car je crois avoir mieux compris la question. Ça doit être un ComboBox s'il est nécessaire de pouvoir retrouver une ligne dont il est connu. Mais si, comme ici, du fait que c'est une longue liste de numéros sans trou, il est toujours plus judicieux de le taper que de le choisir on peut mettre sa propriété ShowDropButtonWhen à 0 (Never)
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Re,
Je me suis effectivement mal exprimé ...
Comme d'hab, c'est difficile de mettre des mots sur des choses que l'on ne maitrise pas ou mal

A la force de faire des modifs, je n'avais pas fait attention a l'erreur sur le fichier joint ...
Mon problème est plutôt dans la fonction garnir champs les "TB_..." reste vide je pense qu'il y a un PB dans "CLSAV" ????
Il ne trouve pas la ligne EFFECTIVEMENT avec CLSAV_BingoUn ca marche mieux ....
Je ne connais pas tous les raccourcis clavés du type F5 pour visualiser l'état des variables pendant l'exécution de VB
Merci beaucoup !
A+
Poups
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

USERFORM "Donnees_sav"
Qu'ai je encore fait ?

Quand je fais un choix avec les combobox, mais je n'est pas l'affichage !
Cela doit être rien comme d'hab
A+
poups
 

Pièces jointes

  • Essais Base.xls
    305.5 KB · Affichages: 51
  • Essais Base.xls
    305.5 KB · Affichages: 52
  • Essais Base.xls
    305.5 KB · Affichages: 50

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Ca fais un moment que je cherchais :mad:
Encore Merci !

Dernière question est il possible de supprimer une ligne entiére via un BT surpprimer un enregistrement ?

Encore une chose tres certainement idiote, ci nous selectionons un interlocuteur par exemple :
Je veux changer l'ortographe du nom => impossible
Je veux me servir des données annexe (évité de les retaper) et mettre un nouveau interlocuteur => impossible

Est ce possible de faire ces manipes, ou mon idé est a oublier ?
A+
Syl
 

Pièces jointes

  • Essais Base.xls
    301 KB · Affichages: 75
  • Essais Base.xls
    301 KB · Affichages: 61
  • Essais Base.xls
    301 KB · Affichages: 64
Dernière édition: