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 :

WORKSHEET_CHANGE qui s'exécute seulement après l'affichage d'une boîte de dialogue [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut WORKSHEET_CHANGE qui s'exécute seulement après l'affichage d'une boîte de dialogue
    Bonjour,
    J'ai toujours trouvé mon bonheur sur ce site, grâce à nombre d'entre vous que je peux enfin remercier, mais là je n'arrive pas à résoudre mon problème. Pour simplifier, dans une feuille de calcul j'efface les données des cellules A1 à A5 puis la cellule M1 enregistre l'heure. Je saisis ensuite des chiffres dans les cellules A1 à A5 et à chaque saisie une TextBox (ControlActiveX nommé TxtChrono) affiche le temps mis entre le RAZ et la saisie. Au bout de 5 saisies un message m'indique que la saisie est terminée.
    Je rencontre 2 problèmes : la macro Worksheet_Change ne se déclenche que si je valide par la touche Enter (pas avec les flèches de déplacement). Pouvez-vous me dire pourquoi ?
    2ème problème : à la 5ème saisie, le message s'affiche puis, seulement après, TxtChrono est mis à jour. Y-a-t'il moyen de forcer la mise à jour de TxtChrono avant d'afficher le message de fin de saisie ? En fait, dans le projet réel, c'est un formulaire qui s'affiche et j'ai besoin de connaître ce temps pour décider de la suite de la procédure. Message ou formulaire, le problème est le même.
    Je remercie par avance tous ceux qui pourront m'aider et m'expliquer pourquoi une macro semble ne pas respecter l'ordre des lignes de code.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Homme Profil pro
    en veille
    Inscrit en
    Avril 2024
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : en veille

    Informations forums :
    Inscription : Avril 2024
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Pour apporter une réponse au problème 1 sur worksheet_change,

    l'évènement worksheet_change ne se déclenche que si une cellule est éditée (modifiée ou la valeur supprimée). Le déplacement avec les flèches de direction ne déclenchent pas la macro

    Une solution simple serait d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet_SelectionChange
    à la place de worksheet_change

    Pour le problème 2, l'utilisation de OLEObjects se rapporte à activex et ce n'est pas toujours simple. Passer une formulaire de type control offre à mon avis une plus grande intéraction et facilité de controle.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci barpasc pour votre aide. J'ai testé la solution Worksheet_SelectionChange mais sans grand succès. Je vais toutefois ré-essayer si vous pensez que c'est la solution.
    Pour le 2ème problème, je suis désolée mais je ne comprends pas votre suggestion. Pouvez-vous m'en dire davantage ?
    Encore merci et veuillez me pardonner ma réponse tardive.

  4. #4
    Membre régulier
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 52
    Points : 105
    Points
    105
    Par défaut
    Pour être notifié à chaque saisie alors mettez le code de Worksheet_Change dans une fonction dans le module1 et supprimez la fonction Worksheet_Change et après sur la feuille choisissez n'importe quelle cellule vide (disons B1)et ajouter la formule utilisant la nouvelle fonction qui sera appelée à chaque saisie

    =ChangeNotify(A1:A5)

    fonction à ajouter dans le module1
    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
    Function ChangeNotify(mRange As Range)
    Dim Temps As Date
    Dim Nombre As Integer
    Dim Ws As Worksheet
     
     Nombre = Application.WorksheetFunction.CountA(mRange)
     ChangeNotify = Nombre
     
     Set Ws = Sheets("Feuil1")
     Ws.OLEObjects("TxtChrono").Object.Value = "Durée du jeu : " & Format(Timer, "hh:mm:ss")
     
     Temps = Format(Time - Ws.Range("Début"), "hh:mm:ss")
     Ws.OLEObjects("TxtChrono").Object.Value = "Durée du jeu : " & Temps
     
     If Nombre = 5 Then
       MsgBox "Saisie terminée"
     End If
     
    Set Ws = Nothing
     
    End Function

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 855
    Points : 28 774
    Points
    28 774
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    a macro Worksheet_Change ne se déclenche que si je valide par la touche Enter (pas avec les flèches de déplacement). Pouvez-vous me dire pourquoi ?
    La procédure événementielle Worksheet_Change intercepte tous changement de valeur qui se produit dans l'une ou plusieurs cellules de la feuille et ce qu'elle que soit la manière dont on la valide. Enter, flèche de direction, Contrôle + Entrée, etc.

    Un simple test avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
      Debug.Print Now() & " Address " & Target.Address
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci Volid, votre solution marche parfaitement, quel que soit le mode de déplacement pour la saisie (Enter ou flèche). Merci également à ceux qui ont bien voulu prendre le temps de me répondre.
    Il me reste quand même le problème de la dernière saisie : la boîte de dialogue "Saisie terminée" s'affiche toujours avant la mise à jour du compteur de temps ; dans la fonction on met à jour le compteur
    Ws.OLEObjects("TxtChrono").Object.Value = "Durée du jeu : " & Temps
    puis, seulement après, on teste si on a fait 5 saisies pour afficher la boîte de dialogue alors pourquoi cette inversion ?

  7. #7
    Membre éclairé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 399
    Points : 698
    Points
    698
    Par défaut
    Bonjour Chris, bonjour à tous,
    C'est un comportement normal, l'évènement Worksheet_Change doit se terminer pour pouvoir afficher les changements de la feuille.
    Une solution de contournement est d'utiliser une ou deux formes dont la formule pointe sur une cellule voir l'exemple fournis.
    Petits retours sur le code :
    • Quand l'on utilise Application.EnableEvents, mettre en place une gestion d'erreurs.
    • Si vous voulez utiliser une feuille alors utiliser Worksheet et non pas Sheets qui peut retourner une feuille, un graphique, etc.
    • Dans l'évènement Worksheet_Change nul besoin de créer une variable Worksheet , Me représente la feuille.
    • L'utilisation de With End With rend le code plus lisible.
    • Privilégier l'utilisation de champ nommés, par exemple .Range("A1:A5").ClearContents par .Range("vr_Saisies").ClearContents (en ayant pris le soin de créer le champ nommé)


    Classeur1.xlsm
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  8. #8
    Membre régulier
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 52
    Points : 105
    Points
    105
    Par défaut
    C'est juste un problème d'affichage le dernier écart de temps est affiché après la fermeture du MsgBox mais il est correct .. cette valeur a été affectée au TextBox bien avant l'appel de MsgBox

  9. #9
    Futur Membre du Club
    Femme Profil pro
    utilisateur
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : utilisateur

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Un grand merci à Valtrase qui a résolu mon problème avec une solution très astucieuse et qui, en outre, donne d'excellents conseils pour améliorer mon code.
    Merci également à Volid pour son aide et peut-être à bientôt sur cet excellent forum.

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

Discussions similaires

  1. Script qui change le résultat après l'affichage
    Par colem dans le forum Langage
    Réponses: 0
    Dernier message: 11/09/2017, 22h54
  2. Réponses: 3
    Dernier message: 25/09/2013, 18h16
  3. Force close après l'affichage d'une ListView
    Par Cuillere dans le forum Composants graphiques
    Réponses: 7
    Dernier message: 27/08/2010, 14h28
  4. Rechargement de la page après l'affichage d'une popup
    Par hokidoki dans le forum ASP.NET
    Réponses: 4
    Dernier message: 23/02/2010, 15h12
  5. Evénement après l'affichage d'une Form
    Par nikhil dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/06/2005, 13h57

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