IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Evenement VBA non sollicité


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut Evenement VBA non sollicité
    Bonjour à tous,

    J'ai un souci avec des évènements VBA non sollicités (volontairement) qui se déclenchent :

    L'évènement _Enter d'une TextBox fait apparaître une InputBox. Si on entre un nombre, un bouton s'active. J'appuie sur ce bouton pour mettre à jour une Spreadsheet. Mais ensuite, l'évènement _Enter de la même TextBox se déclenche à nouveau et semble se déclencher également lors de la fermeture du UserForm ce qui fait qu'une InputBox reste seule à l'écran après la fermeture du programme.

    Application.EnableEvents = False ne résout pas le problème. Je soupçonnais l'évènement _Exit d'y être pour quelque chose mais en le commentant entièrement je me suis rendu compte que ce n'était pas ça.

    L'évènement se déclenche donc normalement et de manière voulue une première fois puis de manière non sollicitée après mise à jour de ma Spreadsheet en appuyant sur le bouton dédié puis dans la foulée de l'évènement _Click de ce bouton il se reproduit. Si avant de cliquer sur le bouton j'appuie sur Tab ou Entrer ou que je clique directement le résultat est le même.

    Mon UserForm :
    Nom : Capture.JPG
Affichages : 189
Taille : 106,3 Ko

    La TextBox impliquée contient le texte "Pression (0 à 1000 mbar)" et s'appelle "TextBoxPression". La commande bouton sur laquelle je clique est "CommandeValiderWEP" et se trouve en bas à gauche. Ci-dessous les codes évènementiels :

    De TextBoxPression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TextBoxPression_Enter()
        If Me.TextBoxPression.Text <> "" Then
            Pression = Application.InputBox(Prompt:="Pression (mbar) =", Title:="Pression (mbar)", Default:=Me.TextBoxPression.Text, Top:=Me.TextBoxPression.Top, Type:=1)
            If VarType(Pression) = vbDouble Then
                Me.TextBoxPression.Value = Pression
                Me.CommandeValiderWEP.Enabled = True
            Else
                Me.TextBoxPression.Text = "Pression (0 à 1000 mbar)"
            End If
        End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub TextBoxPression_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If Me.CommandeValiderWEP.Enabled = False Then
            Pression = Application.InputBox(Prompt:="Pression (mbar) =", Title:="Pression (mbar)", Default:=Me.TextBoxPression.Text, Top:=Me.TextBoxPression.Top, Type:=1)
            If VarType(Pression) = vbDouble Then
                Me.CommandeValiderWEP.Enabled = True
            End If
        Else
            Me.TextBoxPression.Text = "Pression (0 à 1000 mbar)"
        End If
    End Sub
    De "CommandeValiderWEP" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub CommandeValiderWEP_Click()
    If Me.TextBoxPastille.TextLength > 0 Then
        Dim NumeroPastille As Integer
        NumeroPastille = CInt(Right(Me.TextBoxPastille.Value, Me.TextBoxPastille.TextLength - InStr(Me.TextBoxPastille.Value, " ")))
        If NumeroPastille = 1 Then
            With Me.SpreadsheetWEP.Range(Me.SpreadsheetWEP.Cells(Me.SpreadsheetWEP.Range("NumeroPastille").Row + NumeroPastille, _
                Me.SpreadsheetWEP.Range("NumeroPastille").Column), Me.SpreadsheetWEP.Cells(Me.SpreadsheetWEP.Range("EcartRelatifWEP").Row + NumeroPastille, _
                    Me.SpreadsheetWEP.Range("EcartRelatifWEP").Column))
                        .Font.Bold = False
                        With .Interior
                            .ColorIndex = xlColorIndexNone 'aucun remplissage
                        End With
            End With
        Else
            Me.SpreadsheetWEP.Rows(Me.SpreadsheetWEP.Range("NumeroPastille").Row + NumeroPastille).Insert Shift:=xlShiftDown
        End If
        Me.SpreadsheetWEP.Cells(Me.SpreadsheetWEP.Range("NumeroPastille").Row, _
            Me.SpreadsheetWEP.Range("NumeroPastille").Column) _
                .Offset(RowOffset:=NumeroPastille, ColumnOffset:=0).Value = NumeroPastille
        Dim WEP As Double
        WEP = Pression
        Me.SpreadsheetWEP.Cells(Me.SpreadsheetWEP.Range("WEP").Row, _
            Me.SpreadsheetWEP.Range("WEP").Column) _
                .Offset(RowOffset:=NumeroPastille, ColumnOffset:=0).Value = WEP
        Me.TextBoxPastille.Value = "Pastille " & NumeroPastille + 1
        Me.CommandeValiderWEP.Enabled = False
    End If
    End Sub
    Auriez-vous une explication qui me permette de corriger ce problème ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    Je pense que le bon event ici serait AfterUpdate() non ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Merci de ta réponse

    Je ne connaissais pas cet évènement. Je ne le voyais pas dans la liste car elle ne se déroule pas entièrement apparemment (l'erreur à la gomme sûrement en partie due à une nuit blanche récente dont je ne me suis pas encore remis xD)

    Avant de voir ta réponse, j'ai contourné en partie le problème en utilisant l'évènement _KeyPress de la TextBox. Je dis en partie car après la fermeture du UserForm (malgré la propriété .EnableEvents que je règle sur False au déclenchement de _QueryClose) une InputBox apparaît quand même (pas à chaque fois bizaremment). Sinon durant l'exécution le problème ne se présente plus.

    Je vais suivre ta suggestion car elle me semble plus adaptée. Une idée de pourquoi la propriété .EnableEvents ne se met pas à jour ? Ou alors elle se met à jour mais l'inputbox se lance avant la fermeture et persiste car c'est celle de l'application ce qui ferait qu'arrêter la macro ne la tue pas ?

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonsoir certain control comme le speadsheet ,listview on un handle/HDC car ils sont des fenetres a part entieres en fait
    donc quand l'un de ces controls prend le focus par modif de quelque maniere que se soit en perdant le focus le focus revient soit au premier controls du userform voir (tabindex)soit au dernier qu'il avait cette reaction est differente sur 2007 et 2013 soit l'un soit l'autre
    et forcement si il y a du code dans l'event "enter" banco rebelotte va y que je récapepete
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Ah d'accord. Donc effectivement l'évènement _Enter n'est pas un bon choix dans ce cas. Merci pour tes éclaircissements Patrick

    Pour mois tu es le membre en or du mois de juillet

  6. #6
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pour contourner ce problème, il te faut déclarer une variable Booléenne en entête de ton module d'userform et t'en servir pour ne pas exécuter les codes événementiels.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Option Explicit
     
    Private EnableEvents As Boolean
     
    Private Sub CommandButton1_Click()
       EnableEvents = True
       Unload Me
    End Sub
     
    Private Sub TextBox1_Enter()
       If Not EnableEvents Then
          MsgBox "coucou"
       End If
    End Sub
     
    Private Sub UserForm_Activate()
       EnableEvents = False
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
       EnableEvents = True
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. capturer evenements application non java
    Par Finidrigoler dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2006, 11h29
  2. Réponses: 7
    Dernier message: 28/07/2006, 21h21
  3. [C#]Evenement DrawItemEventHandler: non passage ds delegué
    Par titounne dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2005, 09h08
  4. Objet.evenement --> Erreur : Non implémenté
    Par Darkdaemons dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/09/2005, 17h24
  5. Bip non sollicité sur les Edit
    Par David dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/09/2003, 20h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo