[VBA] (excel) Lancement évènement sans raison

Dinoda - 13 janv. 2012 à 00:36
 Dinoda - 13 janv. 2012 à 18:00
Bien le bonjour,



Je me résigne à venir vous demander de l'aide quant à un problème sur un simple programme VBA, il s'agit d'une évènement TextBox_AfterUpdate() qui se lance sans raison apparente lorsque je me rend dans une autre TextBox, que je clique sur la TextBox ou que je me rende dessus à l'aide de la touche "tab", elle se lance, mais pas toujours, cela lui arrive après 2 ou 3 lancement d'une petite section (en faisant les mêmes actions lors de ces différents lancements, mais parfois avec la touche "tab" et des fois avec la souris), pendant laquelle je passe sur tout les textbox du UserForm.



Il existe de plus 4 Textbox subissant les mêmes manipulations et seule la 4ème à ce problème, et même en l'échangeant de place avec une autre (dans l'ordre d'exécution) c'est toujours la 4ème qui bug.



Après une petite heure de débugage, ce problème persiste, je pourrais bien sur contourner le problème en mettant une condition au lancement du contenu de l'évènement mais j'aimerais autant éviter et comprendre le pourquoi de ce lancement inexpliqué.



Quel pourrait d'après vous en être la raison ?



Si vous désirez voir mon code je pourrais vous le donner,



Merci d'avance pour votre aide,



Dinoda

P.S.: désolé pour le pavé
A voir également:

12 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 13/01/2012 à 01:27
Bonjour,
Excel version ?
L'évènement TextBox_AfterUpdate() survient quand tu quitte un TextBox après l'avoir modifié, que ce soit par la souris ou le code.
Mais pour "voir" comment ça fonctionne..
Dans l'évènement TextBox_AfterUpdate() tu met un stop
Tu travail normalement..
Quand le code s'arrête sur le stop tu tape F8 pour passer à l'instruction suivante.
F8 à répétition jusqu'à retrouver l'origine, où si c'est par la souris tu verras pourquoi suivant ce que tu auras fais avant.
y a-t-il du code dans l'évènement TextBox_AfterUpdate() ?
A+

Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
Bonjour

Je me permets de compléter un peu ce qu'a écrit lermite222
Quand tu es arrêté sur le stop, utilise Affichage - Pile des appels pour voir d'où tu viens, plutôt que de faire F8 jusqu'à sortir du sub
Et il y a un autre cas où TextBox_AfterUpdate() peut être appelé : c'est tout bêtement celui où on l'appelle explicitement depuis le code. Commence donc par la fonction Recherche de l'éditeur pour voir s'il n'y aurait pas un appel quelque part...
0
Après utilisation de "Stop", j'ai exactement ce que je disais, l'évènement TextBox4_AfterUpdate() se lance exactement lorsque je clique sur une autre case du UserForm.

Il y a effectivement du code dans Textbox4_afterupdate() qui permet d'entrer son contenu dans une cellule, mais elle s'exécute anormalement et est donc vide lorsqu'elle s'exécute à nouveau, j'ai modifié une variable, ce qui fait que maintenant elle cherche une cellule 0 et bug donc et ne met pas "" dans ma cellule mais ça continu de bugger.

En tout cas merci pour la fonction "Stop", elle pourra m'être utile plus tard.

Merci pour l'aide

P.S. : En regardant la pile des appels, j'ai les informations suivantes :

VBAProject.UserFormAlchimieIngredient.TextBoxEffet4_AfterUpdate
[<Code non Basic>]
VBAProject.module1.Bouton1_Clic

La dernière ligne est liée au bouton dans la feuille excel et n'existe pas si je le lance depuis VBE

P.S. : Je suis sous excel 2007
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 13/01/2012 à 12:26
trouver un problème comme ça à l'aveuglette n'est pas évident, tu n'aurais pas des évènements MouseMove qui seraient employés ? ou MouseDown/Up
Tu à fais comme j'ai dis ? quand arret sur stop continuer avec F8 ?
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Non je n'ai aucun évènement lié à la souris, les seuls évènement sont liés au clic sur des boutons, à la mise à jour des textbox, ou au lancement du UserForm (c'est un programme assez simple en fait me permettant de stocker plus facilement des informations sous forme de colonne), puis les récupérer sous certain critères.

Et j'ai effectivement fait tourner le programme de la première exécution du afterupdate jusqu'au bug avec F8
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
13 janv. 2012 à 12:31
tu répond pas à
Tu à fais comme j'ai dis ? quand arret sur stop continuer avec F8 ?
0
Je comprends pas ce que tu veux dire
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 759
13 janv. 2012 à 12:52
Bonjour,
Je pense qu'effectivement, tout ton code ne serait pas de refus... Ca donnerait peut être une piste...
Là, à l'aveuglette...
0
Bonjour,

Ok alors le voilà :

Le début du code :
Dim nouveau As Boolean
Dim Identifiant As Byte

Private Sub UserForm_Initialize()

    Range("IngredientRecherche").ClearContents

End Sub


Le code des boutons :
Private Sub CommandButtonAcceder_Click()

    UserForm2.Show
    
End Sub

Private Sub CommandButtonFin_Click()

    End

End Sub

Private Sub CommandButtonNouveauIngredient_Click()

    FrameIngredient.Visible = True
    LabelNomIngredient.Visible = True
    TextBoxNomIngredient.Visible = True
    nouveau = True
    Identifiant = Range("NouvelIngredient").Value
    FrameIngredient.Caption = "Nouvel ingrédient"

End Sub

Private Sub CommandButtonModifierIngredient_Click()

    FrameIngredient.Visible = True
    LabelNomIngredient.Visible = True
    TextBoxNomIngredient.Visible = True
    nouveau = False
    FrameIngredient.Caption = "Modification d'un ingrédient existant"

End Sub

Private Sub CommandButtonTerminer_Click()

    nouveau = False
    EffetInvisible
    FrameIngredient.Visible = False
    LabelNomIngredient.Visible = False
    TextBoxNomIngredient.Visible = False
    TextBoxEmpty
    Identifiant = 0

End Sub


Le code des TextBox :

Private Sub TextBoxEffet1_AfterUpdate()

    Range("IngredientEffet1").Cells(Identifiant).Value = TextBoxEffet1.Value

End Sub

Private Sub TextBoxEffet2_AfterUpdate()

    Range("IngredientEffet2").Cells(Identifiant).Value = TextBoxEffet2.Value

End Sub


Private Sub TextBoxEffet3_AfterUpdate()

    Range("IngredientEffet3").Cells(Identifiant).Value = TextBoxEffet3.Value

End Sub


Private Sub TextBoxEffet4_AfterUpdate()

    Range("IngredientEffet4").Cells(Identifiant).Value = TextBoxEffet4.Value

End Sub


Private Sub TextBoxNomIngredient_AfterUpdate()

    MsgBox "AfterUpdate : TextBoxNomIngredient"

    Range("IngredientRecherche").Value = TextBoxNomIngredient.Value
    If (nouveau) Then
        If (Range("RechercheIngredient").Value = "") Then
        Range("Ingredient").Cells(Identifiant).Value = TextBoxNomIngredient.Value
        EffetVisible
        Range("IdentifiantIngredient").Cells(Identifiant).Value = Identifiant
        Else
        MsgBox "Ingrédient déjà existant"
        End If
    Else
        If (Range("RechercheIngredient").Value <> "") Then
        Identifiant = Range("RechercheIngredientIdentifiant").Value
        TextBoxEffet1.Value = Range("IngredientEffet1").Cells(Identifiant).Value
        TextBoxEffet2.Value = Range("IngredientEffet2").Cells(Identifiant).Value
        TextBoxEffet4.Value = Range("IngredientEffet4").Cells(Identifiant).Value
        TextBoxEffet3.Value = Range("IngredientEffet3").Cells(Identifiant).Value
        EffetVisible
        Else
        MsgBox "Ingrédient introuvable"
        End If
    End If
    
End Sub


Les quelques fonctions créées à côté :
Sub EffetVisible()

    LabelEffet1.Visible = True
    LabelEffet2.Visible = True
    LabelEffet3.Visible = True
    LabelEffet4.Visible = True
    TextBoxEffet1.Visible = True
    TextBoxEffet2.Visible = True
    TextBoxEffet3.Visible = True
    TextBoxEffet4.Visible = True
    
End Sub

Sub EffetInvisible()

    LabelEffet1.Visible = False
    LabelEffet2.Visible = False
    LabelEffet3.Visible = False
    LabelEffet4.Visible = False
    TextBoxEffet1.Visible = False
    TextBoxEffet2.Visible = False
    TextBoxEffet3.Visible = False
    TextBoxEffet4.Visible = False
    
End Sub

Sub TextBoxEmpty()

    TextBoxNomIngredient.Value = ""
    TextBoxEffet1.Value = ""
    TextBoxEffet2.Value = ""
    TextBoxEffet4.Value = ""
    TextBoxEffet3.Value = ""
    
End Sub


Le problème est tout simplement l'évènement TextBoxEffet4_AfterUpdate() se déclenche lorsque j'arrive sur la TextBoxNomIngredient, que j'y arrive par la souris ou avec tab.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 13/01/2012 à 14:52
Il est LA ton probl...
   If (Range("RechercheIngredient").Value <> "") Then  
        Identifiant = Range("RechercheIngredientIdentifiant").Value  
        TextBoxEffet1.Value = Range("IngredientEffet1").Cells(Identifiant).Value  
        TextBoxEffet2.Value = Range("IngredientEffet2").Cells(Identifiant).Value  
        TextBoxEffet4.Value = Range("IngredientEffet4").Cells(Identifiant).Value  
        TextBoxEffet3.Value = Range("IngredientEffet3").Cells(Identifiant).Value  
        EffetVisible  
        Else  
        MsgBox "Ingrédient introuvable"  
        End If  
    End If 

met ces lignes en commentaire (je sais ca marchera plus ,mais c'est provisoire)
et vois si tu a encore ce phénomène !!
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
13 janv. 2012 à 15:14
Et tu pourrais déjà simplifier..
Sub EffetVisible( B as boolean)
    LabelEffet1.Visible = B
    LabelEffet2.Visible = B
    LabelEffet3.Visible = B
    LabelEffet4.Visible = B
    TextBoxEffet1.Visible = B
    TextBoxEffet2.Visible = B
    TextBoxEffet3.Visible = B
    TextBoxEffet4.Visible = B
End Sub

Appel>>
EffetVisible True si tu dois les voir ou EffetVisible False si tu dois les cacher
et tu supprime l'autre procédure >> EffetInvisible
0
Merci pour le conseil.

Sinon même en mettant :
TextBoxEffet1.Value = Range("IngredientEffet1").Cells(Identifiant).Value 
TextBoxEffet2.Value = Range("IngredientEffet2").Cells(Identifiant).Value         TextBoxEffet4.Value = Range("IngredientEffet4").Cells(Identifiant).Value          TextBoxEffet3.Value = Range("IngredientEffet3").Cells(Identifiant).Value  


En commentaire, le programme continu de lancer le afterupdate sans raison apparente. C'est seulement celui de TextBoxEffet4 qui se lance.

Qui plus est ça se lance sans passer par ce textboxnomingredient_afterupdate.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 13/01/2012 à 16:53
IngredientEffet1 >> C'est quoi ?
IngredientEffet2 >> c'est quoi, .. etc.

Identifiant >> C'est quoi ? où c'est déclarer ?
en fait ça plante mais parce que tu à des problème dans tes range, prochaine fois décrit AVEC EXACTITUDE le N° et le nom de l'erreur.
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0
En fait ya ni N° ni nom d'erreur

De base j'ai pas d'erreur, c'est juste que l'évènement s'exécute alors qu'il ne devrait pas.

Quant à IngredientEffet1, etc. C'est les différentes plages de cellules nommées.
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
13 janv. 2012 à 17:28
Pfooouuufff..
ET
Identifiant >> C'est quoi ? où c'est déclarer ?
Si tu veux que l'ont essaye de t'aidé la moindre chose c'est de répondre aux questions ?
0
Bah c'est déclaré au tout début, c'est l'identifiant permettant de savoir à quelle ligne les informations entrées doivent être écrites
0