XL 2019 Éviter de recharger plusieurs fois une listbox suite à filtrage avec combobox

SPGoder

XLDnaute Occasionnel
Bonjour
Le petit bout de programme qui suit fonctionne, mais me pose problème dans sa finalité
Je me suis aperçu que la listbox se réinitialisait plusieurs fois (en mettant un point d'arret sur l'initialisation de la listbox) pour un seul changement de filtre (avec des combobox), ou bien même lors de l’exécution de l'USF

Vu le code, c'est tout a fait normal, mais existe il un moyen de faire autrement, car dans le fichier fourni, le contenu de la listbox est très petit, mais à terme, elle va être plus importante
J'ai essayé plein de "bidouille" à mon niveau, mais rien de valable
Merci de vos lumières
 

Pièces jointes

  • Conso_test.xlsm
    35.2 KB · Affichages: 8
Solution
Bonjour
Personne pour se pencher sur mon cas, est ce parce qu’il est désespéré....
Je sais que je réinitialise la listbox plusieurs car je fais apparaitre "Tous" dans les combobox de filtre, mais est ce qu'il existe une solution pour suspendre la réinitialisation si elle a déjà été faite une fois
Si quelqu'un a une idée....
Bonjour SPGoder,

Je viens de voir ton fichier et je me suis penché sur ton cas, qui n'est pas désespéré !

Ce qui se passe, c'est que les procédures événementielles des Combos sont systématiquement déclenchées dès que leur contenu est modifié, non seulement par l'opérateur mais aussi par le logiciel (par exemple par ComboBox_Choix_Nom_Matériel.Value = "Tous").
Elles sont donc appelées plusieurs...

SPGoder

XLDnaute Occasionnel
Bonjour
Personne pour se pencher sur mon cas, est ce parce qu’il est désespéré....
Je sais que je réinitialise la listbox plusieurs car je fais apparaitre "Tous" dans les combobox de filtre, mais est ce qu'il existe une solution pour suspendre la réinitialisation si elle a déjà été faite une fois
Si quelqu'un a une idée....
 

Katido

XLDnaute Occasionnel
Bonjour
Personne pour se pencher sur mon cas, est ce parce qu’il est désespéré....
Je sais que je réinitialise la listbox plusieurs car je fais apparaitre "Tous" dans les combobox de filtre, mais est ce qu'il existe une solution pour suspendre la réinitialisation si elle a déjà été faite une fois
Si quelqu'un a une idée....
Bonjour SPGoder,

Je viens de voir ton fichier et je me suis penché sur ton cas, qui n'est pas désespéré !

Ce qui se passe, c'est que les procédures événementielles des Combos sont systématiquement déclenchées dès que leur contenu est modifié, non seulement par l'opérateur mais aussi par le logiciel (par exemple par ComboBox_Choix_Nom_Matériel.Value = "Tous").
Elles sont donc appelées plusieurs fois, et appellent aussi plusieurs fois les Initialise_ListBox_Intervention et ainsi de suite, ce qui ralentit l'exécution et peut même conduire à des plantages.

Une solution un peu bourrin est d'utiliser une variable globale EventCount et de commencer les procédures événementielles par :
If EventCount Then Exit Sub
EventCount = EventCount + 1

en les terminant par :
EventCount = EventCount - 1
Au lieu d'un compteur on peut utiliser un simple booléen. On peut aussi déclarer la variable en Static au niveau de la procédure.

Cette solution ne m'a jamais trop plu, mais elle a toujours donné de bons résultats dans des cas similaires.
Dans ton cas, avec cette modif, on ne passe plus que 2 fois dans Initialise_ListBox_Intervention ce qui au vu du code me semble normal (testé avec des points d'arrêt).
A toi de creuser cette piste, et bon courage ! Je te joins ton fichier avec ces modifs.
 

Pièces jointes

  • Conso_test_____modif_Katido_10-03-22.xlsm
    39.8 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
re
il y a une seule chose a faire pour eviter à la liste de recharger ou exécuter le code de l'event l'ors dun changement par vba de la value ou la liste d'une combo

VB:
Private Sub ComboBox1_Change()
If ActiveControl.Name = "CombBox1" Then
'le code du change icici

End If
End Sub
et pareil pour le click si tu utilise l'event click
autrement le code sera executé seulement qa=uand tu click ou selectionne dans la combo avec la souris l'est autres event qui te déclenchaient intempestivement l'event combo seront inhibés
simple propre et net
pas besoins d'un compteur
 

SPGoder

XLDnaute Occasionnel
Bonjour
et merci de vos réponses

Pour Katido, cette solution, je l'avais testé, mais je ne mettait pas de -1, donc je tournais en rond....
Par contre, je ne comprends pas :
If EventCount Then Exit Sub
Car il n'y a pas d'élément de comparaison... style If EventCount = 0 Then Exit Sub

Pour Tchi, quoi dire... Si je devais mettre un niveau VBA de 1à 10, moi je suis à 1 voir 2, mais là ça dépasse mes connaissances et compétences. Mais je vais prendre le temps de l'étudier
Évidemment, ça fonctionne nickel

Et Patrick, Je vais tester, à lire cela parait logique., et correspond bien au fait que la recharge de la listbox ne se fera que sur le changement d'un seul combo

Merci à vous, je tout ça teste ce soir
 

ChTi160

XLDnaute Barbatruc
Re
tu dis :
Pour Tchi, quoi dire... Si je devais mettre un niveau VBA de 1à 10, moi je suis à 1 voir 2, mais là ça dépasse mes connaissances et compétences. Mais je vais prendre le temps de l'étudier
moi je pense être arrivé à 3 (loin loin derrière "PatrickToulon"
si besoin d'explications n'hésite pas !
Bonne fin de Journée
Jean marie
 

SPGoder

XLDnaute Occasionnel
Patrick, je dois commettre une erreur, mais je ne vois pas où, du coup, ça ne fonctionne pas
Je joins le fichier, avec une seule modif pour un combo (ComboBox_Choix_Unité)
 

Pièces jointes

  • Conso_test.xlsm
    41.4 KB · Affichages: 1

Katido

XLDnaute Occasionnel
re
il y a une seule chose a faire pour eviter à la liste de recharger ou exécuter le code de l'event l'ors dun changement par vba de la value ou la liste d'une combo



VB:


Private Sub ComboBox1_Change()
If ActiveControl.Name = "CombBox1" Then
'le code du change icici

End If
End Sub

et pareil pour le click si tu utilise l'event click
autrement le code sera executé seulement qa=uand tu click ou selectionne dans la combo avec la souris l'est autres event qui te déclenchaient intempestivement l'event combo seront inhibés
simple propre et net
pas besoins d'un compteur

Le pb c'est que ça ne marche pas. Dans le cas de SPGoder, le contrôle actif est Multipage_Recherche
De plus, il faut que le formulaire soit affiché, sinon erreur.

If Consultation.Visible Then
If Consultation.ActiveControl.Name = "Multipage_Recherche" Then
' le code
End If
End If

Ça ne marche pas non plus, d'autant que "Multipage_Recherche" est certainement le seul contrôle actif
 

Statistiques des forums

Discussions
312 185
Messages
2 086 012
Membres
103 093
dernier inscrit
Molinari