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

Résolu
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 12 oct. 2011 à 00:11
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre 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é

9 réponses

SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
12 oct. 2011 à 01:42
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é
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 oct. 2011 à 00:30
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)
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
12 oct. 2011 à 00:47
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é
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 oct. 2011 à 01:15
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
12 oct. 2011 à 01:29
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é
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
12 oct. 2011 à 07:31
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.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 oct. 2011 à 10:45
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 oct. 2011 à 11:06
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
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
12 oct. 2011 à 16:56
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
0
Rejoignez-nous