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

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é

12 réponses

  1. Contributeur
    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
    1. 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
      1. 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
        1. Contributeur
          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
          1. 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
            1. Contributeur
              tu répond pas à
              Tu à fais comme j'ai dis ? quand arret sur stop continuer avec F8 ?
              0
            2. Je comprends pas ce que tu veux dire
              0
          2. Modérateur
            Bonjour,
            Je pense qu'effectivement, tout ton code ne serait pas de refus... Ca donnerait peut être une piste...
            Là, à l'aveuglette...
            0
            1. 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
              1. Contributeur
                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
                1. Contributeur
                  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
                  1. 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
                    1. Contributeur
                      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
                      1. 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
                        1. Contributeur
                          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
                        2. 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