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

Dinoda -  
 Dinoda -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. le père
     
    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
  3. Dinoda
     
    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
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Dinoda
     
    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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      tu répond pas à
      Tu à fais comme j'ai dis ? quand arret sur stop continuer avec F8 ?
      0
    2. Dinoda
       
      Je comprends pas ce que tu veux dire
      0
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Je pense qu'effectivement, tout ton code ne serait pas de refus... Ca donnerait peut être une piste...
    Là, à l'aveuglette...
    0
  8. Dinoda
     
    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
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  11. Dinoda
     
    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
  12. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  13. Dinoda
     
    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. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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. Dinoda
       
      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