[Catégorie modifiée VB6 -> VBA] Est-il possible de retarder l'évènement "WorkBoo [Résolu]

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
- - Dernière réponse : SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
- 12 oct. 2011 à 16:56
Bonsoir le Forum,

J'ai une petite question...J'ai un classeur Excel qui contient un module, mais également un évènement "WorkBook_SheetChange" situé dans "ThisWorkBook".

Quand je lance ma macro cet évènement se lance également automatiquement (logique). Or moi j'aimerais que cet évènement ne se déclenche qu'une fois le code du module exécuté entièrement. Quand la macro à finit de s’exécuter en quelque sorte.
Est il possible de faire déclencher cet évènement sous conditions, ou de lui mettre un "wait" ou je ne sais quoi d'autre ???

Je ne sais pas si ma question est claire, et je ne sais pas non plus si c'est envisageable.

Dans tous les cas, je prends vos conseils.

Bien cordialement,

André
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
3
Merci
Ayé j'y suis arrivé.

J'ai utilisé la méthode de la variable publique. Très facile à mettre en œuvre et surtout qui marche au top.

A tous je vous souhaite une bonne soirée.

Encore merci pour m'avoir aiguillé.

André

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de SERIEUXETCOOL
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Salut

Comme déjà précisé, tu fais du VBA, pas du VB6 --> Catégorie modifiée

Si tu ne dois exécuter ces lignes qu'à la fin d'un traitement, pourquoi l'as-tu mis dans cette Sub WorkBook_SheetChange ?
Mets ton code dans une Sub personnelle et appelle-la quand tu auras fini ton traitement, exemple :
Sub maSubPerso()
   ' Mon traitement à faire à la fin
End Sub
Sub MaMacroPrincipale()
   ' Mon gros traitement ...
   Call maSubPerso
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
0
Merci
Merci Jack d'avoir rectifié la catégorie. Dsl^^

Mon code est à traiter à la fin de la macro principale. Sauf que si je le met dans mon module, ce code ne sera traité qu'une seule fois. Il s'agit d'une mise en forme conditionnelle. Donc dès que certaines cellules sont activées, il faut calculer de nouveau sinon sa ne fonctionne pas.

C'est une mise en forme spéciale qui n'est pas simple à coder. Je suis obliger de sortir le code de cette mise en forme conditionnelle du module principal.

Mettre le code dans un "ThisWorkBook" est judicieux mais le problème c'est qu'il se met à jour tout du déroulement de la Macro.

Je me demandais si avec une variable public qui changerait d'état uniquement à la fin de la Macro sa ne marcherait pas ?

Un truc du genre :

Public Variable FINI
While FINI = False
Exit Sub
Wend


Faut que je teste cette idée.

Au fait sa existe une fonction du style "Tant que module1 est en cours, alors ne pas déclencher l'évènement..." ???

André
Commenter la réponse de SERIEUXETCOOL
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Pas tout compris, mais bon, déclare une variable Booléenne dans la déclaration de ton WorkBook et passe-la à True tant que ne veut pas exécuter ta Sub d'event, et dans cette même Sub, tu ajoutes un truc du style
If maVariableBool Then Exit Sub
Repasse-la à False quand tu veux qu'elle s'exécute (ou l'inverse, comme tu le sens)
Commenter la réponse de cs_Jack
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
0
Merci
C'est à mon tour ne pas avoir tout saisi.

Voila ce que j'ai compris :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim maVariableBool as Boolean

If maVariableBool = True Then Exit Sub

If maVariableBool = False Then
'Déroulement de mon code
End If

End Sub


Mais comment la variable "maVariableBool" changera t'elle d'état ??? Je pense que j'ai mal compris ton post. La variable "maVariableBool" ne serait elle pas déclarée public par hasard ? Et si elle est déclarée public, alors je la déclare tout en haut de mon module, ou tout en haut de "ThisWorkBook" ?

Merci pour le complément d'infos.

André
Commenter la réponse de SERIEUXETCOOL
Messages postés
94
Date d'inscription
vendredi 13 mai 2005
Dernière intervention
30 octobre 2011
0
Merci
Bonjour,

Pour info

Au fait sa existe une fonction du style "Tant que module1 est en cours, alors ne pas déclencher l'évènement..." ???


Il existe
Application.EnableEvents = False

qui permet de bloquer le déclenchement d'un événement

et
Application.EnableEvents = True

pour revenir à une situation "normale".

Bonne journée.
Commenter la réponse de cs_GG72
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Ah bah oui, GG, tu as raison, je n'y avais pas pensé.

Pour en revenir au Booléen, je t'ai dit (à tort) de le déclarer "dans la déclaration de ton WorkBook", pas dans la Sub; c'est à dire tout en haut de la page de code, juste après le "Option Explicit" (que j'espère tu utilises - voir option "déclaration obligatoire des variables")
En fait, pour que tout ton projet puisse avoir accès à cette variable, il faut :
- la déclarer en Public (à la place du Dim)
- dans un module, pas dans le Workbook
Commenter la réponse de cs_Jack
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,

Je ne suis pas entièrement d'accord avec vous car il y a là 2 problèmes :
1) la macro en cause modifie des cellules pouvant être celles objets de la MFC prévue dans l'évènement SheetChange ===>> on peut alors jouer avec enableevents
mais
2) à la remise à true de Enableevents, la mfc ne s'effectuera point "automatiquement" sur ces cellules

seule solution à mon avis si l'on veut le beurre et l'argent du beurre :

1) laisser les choses telles qu'elles sont dans l'évènement SheetChange
2) dans la macro de modifications des cellules :
--- a) enableevents à false au début et à True à la fin
--- b) y recenser la plage des cellules modifiées (mais uniquement celles cponcernées par la mfc
--- c) revenir sur cette plage en l'utilisant pour forcer la mfc des cellules qui doivent la subir


Je dirais que, pour ne pas trop alourdir par des "redondances" de code :

Prévoir simplement une procédure distincte, appelable :
- tant depuis l'évènement sheetChange (en passant les paramètres des feuilles et cellules concernées)
que
- depuis la macro en utilisant sur la plage (voir plus haut) une boucle for each et en passant, dans cette boucle, les paramètres attendus par la procédure distincte.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Dernière intervention
12 juin 2012
0
Merci
Je repassais par la par curiosité et je vois vos derniers commentaires...

Je vous rappelle que j'ai résolu mon problème^^

J'ai tout d'abord réussi une première fois en utilisant une variable booléenne publique. Puis par curiosité j'ai essayé également la fonction "Application.EnableEvents False" et "Application.EnableEvents True". Au final je me suis dit que le principe est le même pour les 2 solutions. C'est à dire bloquer l'évènement durant le module principal puis le réactiver en fin de macro. Et en fait sa marche très bien également. Avec l'avantage de se coder en peu de lignes^^

J'ai donc changer mon fusil d'épaule et utilisé la méthode "Application.EnableEvents = False". (Ce qui reviens au même que la méthode Variable publique)

Néanmoins Ucfoutu n'a pas tord (il a rarement tord en même tps^^), en sortie de Macro l'évènement est remit actif mais n'est pas déclenché automatiquement. Il faut attendre que l'utilisateur fasse le premier pas en gros.

Par contre, dans MON code, je génère au passage de la macro une mise en forme conditionnelle particulière. Je le fais une seule fois au passage de la macro. Ainsi en sorti de Macro, ma mise en forme conditionnelle est appliquée avec les valeurs qui sont affectées durant la macro.

Par la suite dès lors que l'utilisateur touche au cellules ayant cette mise en forme particulière, le WorkBook prends le relais et change automatiquement les valeurs. Chose que n'est pas capable de faire la macro.

En résumé : Au passage de la Macro, j'applique une mise en forme qui fonctionne. En sortie de Macro ma mise en forme est ponctuelle mais fonctionne. Dès lors que l'utilisateur change une valeur, le WorkBook prends le relais et rends tout cela transparent et opérationnel.

Et voila^^

Sa fait bricolage un peu mais après 2 jours de prise de tête sur le problème et seulement 20 lignes de codes qui fonctionnent... Se me conviens TRÈS bien.

Évidemment aucun évènement du WorkBook n'est utile au cours du déroulement de la Macro principal. Ce qui fait que je peux les désactiver sans problèmes.

Moi sa me conviens et je ne changerais pas de solution. (2 jours de casse tête pour un petit drapeau qui est automatique, faut pas pousser lol)

D'ailleurs j'ai changé de problématique. Je vais ouvrir de ce pas une nouvelle discussion. ( En rapport à la trigonométrie et la fonction Arc Cosinus).

A tout de suite peut être...

André.

Ps : Sujet Résolu
Commenter la réponse de SERIEUXETCOOL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.