Liste qui se met à jour sans mon accord !

Z

Zbod

Guest
Salut !

Bon, je pose le décor : j'ai créé un Userform contenant une ListBox (LstClients) qui affiche la liste de mes clients.
Lorsque je clique sur l'un d'eux, les infos le concernant sont affichées à coté dans différentes TextBox.
J'ai aussi un bouton "Modifier" qui me permet de mettre à jour les infos du client sélectionné.

Et c'est là que le problème survient. Lorsque je modifie le Nom du client (ou son Prénom) ça délire complétement (rien ne s'inscrit où je veux).

Donc, j'ai refais les tests à grands coups de F8 (pas à pas) et je me suis rendu compte que lorsque je mets à jour les données affichées dans la liste (Nom et Prénom, le reste étant affiché quand on clique dessus), le programme va chercher la procédure "LstClients_Click()" qui affiche les infos clients.

Tout le monde suit ???
En clair, je sélectionne un client, je modifie son Nom, je clique sur Modifier.
Alors, le prog met à jour la cellule contenant le Nom et s'aperçoit que ce qu'affiche la liste n'est plus bon, donc va dans la procédure de la liste... celle où je demande d'afficher les infos du client.

Du coup, le LstClients.ListIndex part en sucette, les données ne sont pas mises à jour (puisque la procédure _Click() lui demande d'afficher ce que contient les cellules avant qu'elles ne soient modifiées)...


Bref, ma question est : comment faire pour mettre à jour une ListBox sans que le prog n'aille dans la procédure de celle-ci (LstClients_Click), qu'il reste dans la procédure de mon bouton Modifier ???

Voilà. J'espère qu'il y en a au moins un de vous qui aura pigé et qui me dira que c'est tout con !
Merci d'avance.
A+
 
@

@+Thierry

Guest
Bonsoir Zbod, le Forum

J'ai déjà eu l'occasion de batailler avec les évènements qui se déclenchent intempestivement...

Ma solution consiste en l'emploi d'une Variable Public de Type Boolean.
La mise en oeuvre d'une telle solution se fera selon ce shéma :

Option Explicit

Dim PasdeMAJ As Boolean 'En top du Private Module du UserForm

Private Sub UserForm_Initialize()
PasdeMAJ = False
'Ton Code
End Sub


Private Sub CommandButton1_Click()
PasdeMAJ = True
'Ton Code
'....
'Fin de Ton Code
PasdeMAJ = False
End Sub


Private Sub ListBox1_Click()
If PasdeMAJ = True Then Exit Sub
'Ton Code
End Sub


En général par ce procédé, j'arrive à lutter contre les éléments... oups les évènements !!! (lol)

Bonne Soirée
@+Thierry
 
M

Mathieu

Guest
Salut Zbod, le forum,

alors j'ai vite lu ton probleme, et moi dans ce cas je ferai qq chose de pas trés propre, mais qui marcherai surement: j'utiliserai un "drapeau", un booléen dont la valeur serai testée au debut de LstClients_Click pour savoir s'il doit ou nom executer la procédure.

Enfin, la c'est dur a expliquer parce que j'ai pas tout comprit a ton expliquation.

En gros ca serai ca :

Dim ExecuterLaProcedure as boolean


LstClients_Click()

if ExecuterLaProcedure=true then
......
......

End if

End Sub

Et c'est a toi de gérer a quel moment tu mets ce drapeau a vrai, et a quel moment il repasse a faux, tu vas ainsi pouvoir gerer l'execution de ta sub.

Bon courage,
Mathieu.

PS : je reste pas dans les parages, si vraiment tu y arrives pas tu peux tjrs m'envoyer un mail avec ta pj, et avec plus d'infos sur le fonctionnement.

Happy Week end !!
 
@

@+Thierry

Guest
Bonsoir Mathieu, re Zbod

Pas de problème, d'autant plus que tu rejoins ma solution. Par contre l'usage d'une Boolean ne peut être considéré comme un "Flag" (qui est autre chose en programmation)

Par ailleurs, l'usage d'une Boolean en tant que "verrou conditionnel" pour le lancement d'une évènementielle n'est absolument pas une solution "sale" ou "pas très propre". Pour autant bien sûr que l'on maîtrise bien son usage et sa portée.

Bonne fin de journée à tous
@+Thierry
 
B

Bernard

Guest
Bonsoir @+Thierry

Mais oui tu nous manques avec tes démos d'enfer !
accro.gif


Alors fais toi un peu moins rare pour le bonheur de tout le forum.

Au plaisir
disk.gif


Bernard
 
Z

Zbod

Guest
Merci pour vos réponses rapides....

Ce problème, je le traîne depuis quelques temps déjà et j'avais pensé à cette histoire de "drapeau" (je vois que l'on utilise tous la même méthode).
Ca ne règle pas le problème malgré tout.


Extrait Code Bouton Modifier :

ModifEnCours = 1
If Txt_32_Nom <> Cells(Lst_32_Liste.ListIndex + 2, 4) Then
.......
Cells(Lst_32_Liste.ListIndex + 2, 4) = Txt_32_Nom
(----> Là ça repart dans le code de la ListBox)
End If
ModifEnCours = 0


Extrait Code Liste Clients :

If ModifEnCours = 1 Then Exit Sub


On pourrait croire que tout va bien, mais je ne sais pas pourquoi, le ListIndex revient à -1.
Donc, quand ça repart dans Modifier et que ça teste le reste des infos, ben ça teste avec la mauvaise ligne !

En clair, pourquoi le ListIndex se remet à -1 ?
Merci d'avance.
 
@

@+Thierry

Guest
Bonjour Bernard

Merci à toi et aux autres de ces petits signes de sympathie qui démontrent bien que vous ne m'avez pas oublié.

Mais je me fais rare tout simplement parceque j'ai vraiment un taff de fou, et quand on se tape plus de 12 heures de prog par jour, ma détente est souvent loin d'un PC... Mais je vous aime toujours et ne vous oublie pas.

Merci
@+Thierry
 
@

@+Thierry

Guest
Re Bernard

Sans avoir ton code entier sous les yeux, si tu ré-initialises ta ListBox, c'est on ne peut plus normal que sa propriété ListIndex soit ensuite remise à -1 (ce qui signifie qu'il n'y a pas de sélection)

Il dépend donc de toi de lui "forcer" sa ListIndex avec une Variable Public de type Byte qui conservera en mémoire l'index de l'Item sur lequel le User aura cliqué....

Bon Courage
@+Thierry
 
Z

Zbod

Guest
Bonsoir tout le monde...

Merci pour vos réponses.
Bon, Ok pour forcer le ListIndex, même si je ne pensais pas que le fait de retourner dans la procédure "LstClients_Click()" aller le réinitialiser puisque cette procédure ne fait qu'afficher les infos du client (que des TextBox dont le Caption change).
Bref, j'vais changer ça.

Merci encore.
@+

PS : je reviens vous voir si problème.
 
Z

Zbod

Guest
Je complète un peu le post précédent.
Voici une partie de mon code :


Private Sub Cmd_32_Modifier_Click()
ModifEnCours = 1
.....
If Txt_32_Nom <> Cells(Lst_32_Liste.ListIndex + 2, 4) Then
.....
Cells(Lst_32_Liste.ListIndex + 2, 4) = Txt_32_Nom
[-> Là ça va tout seul dans la procédure de la ListBox]
End If
.....
ModifEnCours = 1
End Sub


Private Sub Lst_32_Liste_Click()
If ModifEnCours = 0 Then
Txt_32_Nom = Cells(Lst_32_Liste.ListIndex + 2, 4)
.....
End If
End Sub


Voilà en gros ce que j'ai.
La variable ModifEnCours permet de ne pas exécuter la procédure (et pas foutre le bordel) de la liste.

Quand je fais ça, le ListIndex de la liste se remet à -1 (pas de sélection) alors que je ne l'ai pas demandé. Du coup, quand je reviens dans la procédure Modifier, ben ça fait des comparaisons avec la mauvaise ligne.

J'espère être clair.
Pourquoi le ListIndex se remet tout seul à -1 ?

Dans une autre situation similaire dans ce bouton Modifier, le ListIndex se met à une autre valeur (aléatoire?) : par exemple je sélectionne la ligne 12 et après la modif, le ListIndex vaut 9 ???
Va falloir m'expliquer là...

Merci d'avance.
@+
 
S

salim

Guest
Bonsoir le Fil et le Forum


Attend j'y crois pas
C4.gif
@+Thierry j'ai pas fumer
smiley_221.gif
pourtant.
faut que je regarde de plus près
pc5.gif
mais non c'est bien lui. ça fait plaisir
smiley_118.gif
de te croiser @+Thierry
F5.gif
je te souhaite une bonne soirée et te dit à bientôt .

salim
 
@

@+Thierry

Guest
Bonjour Salim, re le Fil, le Forum

Et non Salim, tu n'es pas en pleine halu !! lol.... Mais hélas je ne fais que passer, les semaines à venir vont être encore chargées. Merci à toi pour ce gentil accueil.

Bon pour Zbod, c'est assez le bazard ton histoire. Impossible de te répondre, sans voir le module complet de ce UserForm, en plus quand je vois "Cmd_32_Modifier" ou "Lst_32_Liste", j'ose espérer que tu n'as pas 32 ListBox et 32 CommandButton !!!

Ce que je peux te dire simplement, c'est qu'une ListBox réagit dans son incrémentation séquentielle de numéro d'index exactement comme un Tableau en Base Zéro....

&nbsp;&nbsp;¤Toto
&nbsp;&nbsp;¤Zaza
&nbsp;&nbsp;¤Lulu '<== Sélection
&nbsp;&nbsp;¤Titi
&nbsp;&nbsp;¤Lolo

Dans cet exemple, si tu captes le numéro de ListIndex à cet instant : il sera 2

De même si tu n'as aucune sélection le numéro de ListIndex sera de -1 et en suivant cette même logique, on pourrait forcer la sélection sur "Toto" avec un ListIndex = 0

Je pense que tu dois t'entrainer sur des exemples simples de UserForm avec des ListBox afin de bien assimiler ce processus, avant de te lancer dans des Usines à Gaz. (Mais en aucun cas, VBA ne te renverra un numéro aléatoire de ListIndex, ou alors tu t'es mélangé les pinceaux entre tes Controls !!!)

Bon Courage
@+Thierry
 
Z

Zbod

Guest
Salut Thierry !
Merci pour tes infos.

Heu... les "32" signifient simplement 3ème Userform et 2ème onglet.
J'ai 7 Userforms qui contiennent chacun plusieurs onglets (MultiPage).

Sinon je ne suis pas expert en VBA mais je pense en savoir suffisament sur le principe que tu évoques (base 0) et donc les ListIndex ne me font pas trop peur.
Je ne pense pas que le VBA renvoie un ListIndex aléatoire mais je n'explique pas une autre valeur que -1 à la rigueur.

Bref, j'en sais pas plus pour l'instant, même si j'ai une petite idée sur la question (ce que j'avais fais avant : mettre le ListIndex dans une variable).

Plus d'infos si je m'en sors.
@+
 

Discussions similaires

Réponses
93
Affichages
2 K

Statistiques des forums

Discussions
312 412
Messages
2 088 196
Membres
103 763
dernier inscrit
p.michaux