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 :

Un userform et les évenements : Comportement étrange. [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 226
    Par défaut Un userform et les évenements : Comportement étrange.
    Bonjour à toutes et tous,

    J'ai un souci (je ne comprends pas la raison).

    J'explique:

    J'ai crée un userform qui contient un "texte box" et un bouton "Sauve" (exemple pour bien comprendre).
    Lorsque je l’appelle, dans l'initialisation de ce formulaire, je rempli le texte boxe (donnée venant d'une feuille).

    Ce que j'aimerais, est, quand je clique sur le bouton "Sauve", que cela enregistre UNIQUEMENT quand le contenu du texte box à CHANGE.

    Pour ce faire, j'ai deux drapeaux (boolean):
    Je les ais déclarés dans le module : module1 dans la partie déclarative.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public fgSave As Boolean
    Public fgInit As Boolean
    fgInit : Celui-ci est mis à "vrais" quand j'initialise le formulaire. Cela empêche que l’événement "After-Update" déclenche.
    Une fois l'initialisation terminé, je le met sur "faux".

    fgSave : A la fin de l'initialisation il est mis à "faux". Quand on modifie le contenu du texte box, il ce mets sur "vrais".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub T_Text_AfterUpdate()
        If Not fgInit Then
            fgSave = True    ' J'ai placé un break point ici
        End If
    End Sub
    Lorsque j'exécute le code en "pas à pas", tout fonctionne très bien.
    Lorsque je le laisse fonctionner tous seul sans toucher à quoi que se soit, le programme s'arrête au break point. Ce n'est pas logique !...

    Comment se fait il que cet événement ce déclenche ?
    Comment l'éviter?

    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
    Private Sub UserForm_Initialize()
        Dim feuille as Worksheet
        Set feuille = ActiveWorkbook.Worksheets("Sheet1")    
        fgInit = True
     
        With Nom_UserForm
            If  Numero_ID > 0 Then
                .T_Text.text = feuille.Cells(Numero_ID, 1)
            End If
        End With
        fgInit = False
        fgSave = False
    End Sub
    Private Sub BT_Save_Click()
        If Not fgSave Then
            MsgBox "No change", vbInformation + vbOKOnly, "Remark"
            fgSave = False
        End If
    End Sub
    J'en perds mon latin. Quelqu'un aurait-il une idée?
    Merci d'avance de votre aide

    Bonne après-midi
    André

  2. #2
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour André.

    C'est simple. L'événement T_Text_AfterUpdate est déclenché après que la procédure UserForm_Initialize soit complétée. Et la valeur de fgInit est alors égale à false.
    Change de place la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub T_Text_AfterUpdate()
        If Not fgInit Then
            fgSave = True    ' J'ai placé un break point ici
        End If
        fgInit = False
    End Sub
    Et force le déclenchement de AfterUpdate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .T_Text.Text = "tempor"
                .T_Text.Text = feuille.Cells(Numero_ID, 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub UserForm_Initialize()
        Dim feuille As Worksheet
        Set feuille = ActiveWorkbook.Worksheets("Sheet1")
        fgInit = True
     Set Nom_UserForm = UserForm1
        With Nom_UserForm
            If Numero_ID > 0 Then
                .T_Text.Text = "tempor"
                .T_Text.Text = feuille.Cells(Numero_ID, 1)
            End If
        End With
     
        fgSave = False
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tu as certainement place un point d'arrêt dans ta sub pour ensuite faire du pas à pas!

    Ensuite tu as retirer le point d'arrêt ou quitter Excel!

    Ça arrive souvent c'est un point d'arrêt fantôme, vas dans menu débogage supprime les points d'arrêts. Il est possible que tu doives le faire plusieurs fois!

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour dede_bo,

    Pourquoi ne pas enregistrer directement la variable en tant que variable globale ?

    Voici ce que je te propose :
    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
    Option Explicit
    Public var As String
     
    Private Sub CommandButton1_Click()
     
    If UserForm2.TextBox1.Value <> var Then
        Worksheets("test").Range("D9") = UserForm2.TextBox1.Value
    End If
     
    End Sub
     
    Private Sub UserForm_Initialize()
     
    With Worksheets("test")
        Me.TextBox1 = .Range("B9")
        var = Me.TextBox1.Value
    End With
     
    End Sub
    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Peut être en remplaçant le code de la fenêtre du UserForm par le code suivant
    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
    29
    30
    31
    32
    33
    Dim ValeurDepart
    Dim fgSave As Boolean
     
    Private Sub UserForm_Initialize()
    Dim feuille As Worksheet
    '---
    Set feuille = ActiveWorkbook.Worksheets("Sheet1")
    Numero_ID = 1  '///1 par défaut (à adapter)
     
    ValeurDepart = feuille.Cells(Numero_ID, 1)
     
    With Me 'Nom_UserForm '///par défaut (à adapter)
      If Numero_ID > 0 Then
        .T_Text.Text = feuille.Cells(Numero_ID, 1)
      End If
    End With
    End Sub
     
    Private Sub BT_Save_Click()
    If Not fgSave Then
      MsgBox "No change", vbInformation + vbOKOnly, "Remark"
    Else
      MsgBox "Il y a du changement", vbCritical + vbOKOnly, "Remark"
    End If
    End Sub
     
    Private Sub T_Text_AfterUpdate()
    If T_Text <> CStr(ValeurDepart) Then
      fgSave = True
    Else
      fgSave = False
    End If
    End Sub
    et en supprimant les variables booléennes de Module1
    Pour ce faire, j'ai deux drapeaux (boolean):
    Je les ais déclarés dans le module : module1 dans la partie déclarative.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 226
    Par défaut Situation
    Bonjour à tous les 3,

    Pour commencer, j'aimerais m'excuser pour ma réaction tardive mais je sors d'une longue réunion et je n'ai pas eu le temps de réagir.
    Ensuite, j'aimerais également vous remercier de donner de votre temps pour m'aider.

    Enfin, j'ai essayé vos 3 idées, mais hélas ... sans succès. cela ne fonctionne pas.

    Pour Docmarti : lorsque l'application tourne, je ne vois pas la valeur temporaire se remplir (à moins que ce soit extrêmement rapide).
    En "pas à pas" cela fonctionne mais pas tout seul.

    Pour rdurupt: Rien, j'ai essayé plusieurs fois ...

    pour Kimy_Ire : L'idée est bonne si je n'avais qu'un champs ou 2. Ici, j'en ai 32 à afficher.
    L'idée que j'avais est simplement de mettre un drapeau (variable globale) que je change d'état sur chaque champs du formulaire sur
    l'evenement "After-Update", et lorsque je clique sur le bouton "Sauve" je contrôle l'état du drapeau.

    Voilà la situation actuelle.

    Bonne après-midi
    André

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 226
    Par défaut Résultat final ... Cela fonctionne
    Bonjour,

    J'ai trouvé une solution.

    L'origine du problème est le focus lorsque l'initialisation est terminée.

    Au départ, le focus se plaçait automatiquement sur le champ texte. J'avais le problème.
    J'ai déplacé le focus sur le bouton "Fermeture" et mon code original fonctionne très bien.

    Ne me demandez pas le pourquoi ... mais je constate !

    Merci tout de même pour votre support.

    Bon après-midi
    André

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Ce code devrait fonctionner :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Private Sub TextBox1_AfterUpdate()
      If Not fgInit Then
            fgSave = True
        End If
    End Sub
     
     
    Private Sub T_Text_AfterUpdate()
        If Not fgInit Then
            fgSave = True
        End If
        fgInit = False
    End Sub
    Private Sub UserForm_Initialize()
        Dim feuille As Worksheet
        Set feuille = ActiveWorkbook.Worksheets("Sheet1")
     
        fgInit = True
     Set Nom_UserForm = UserForm1
        With Nom_UserForm
            If Numero_ID = 0 Then
             fgInit = False
            Else
             .TextBox1.Text = feuille.Cells(Numero_ID, 2)
     
             'T_Text doit etre le dernier controle a etre modifie car fgInit = False se trouve dans Sub T_Text_AfterUpdate
             .T_Text.Text = "tempor"
             .T_Text.Text = feuille.Cells(Numero_ID, 1)
            End If
        End With
     
        fgSave = False
    End Sub
    Private Sub BT_Save_Click()
        If Not fgSave Then
            MsgBox "No change", vbInformation + vbOKOnly, "Remark"
            fgSave = False
        End If
    End Sub

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/11/2012, 20h00
  2. Comportement étrange de setTimeout(), il "mémorise" les évènements
    Par dacid dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/06/2010, 17h19
  3. Comportement étrange avec les index et "order by"
    Par Dia_FR dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/08/2008, 09h18
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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