VBA ThisWorkbook et EnableEvents

Bonjour à tous,

Sur un fichier le "Private Sub Workbook_Open()" ne fonctionnait plus, il s'est remis en marche

en fermant tout Excel,

Est-ce-que cela pouvait provenir d'un "Application.EnableEvents = False" qui trainait sur un autre fichier ouvert ?

Bonne journée

Claude.

Bonjour,

Certainement, je pense

Avec enableevents, nottamment lors d'essais de la macro, j'ai toujours une procédure d'urgence dans un module qui restaure enablevents=true et displayalerts=true

et dans workbook before close j'inclue systématiquement cette restauration... Peut-^tre à tort et parano, d'ailleurs!

Bonsoir, Claude

Dans nombre de tes fichiers, tu uses, abuses, de cette fonctionnalité...

Application.EnableEvents se doit de rester une commande d'une feuille.....

Il est regrettable de voir ce type de commande dans un module....

Maintenant, tu le sais, à tes dépens...

Tu as bien d'autres solutions, mais cette commande est à prendre avec énormément de précautions...

Au plaisir

Hub

Bonsoir cousinhub,à tous,

en parlant des "EnableEvents" (False/True)

Il est regrettable de voir ce type de commande dans un module....

Il est vrai que je place presque systématiquement un "EnableEvents = False" en début de

chaque procédure.

Merci de me corriger sur cette mauvaise habitude,

Je pensais qu'en court-circuitant les "EnableEvents", j'accélérais la procédure.

c'est en faisant du "pas à pas" et voyant le circuit que fait une macro (elle passe plusieurs fois

par les Private événement), que je pensais çà ! à tord

Je pensais également qu'il n'y avait pas d'inconvénient, du moment qu'on remettait à True en

fin de macro.

Evidemment en cas de bug entre les deux, c'est cuit !

Sur mon fichier en cours, j'ai donc supprimé ces lignes de code (environ 10+10) et je ne vois

pas de changements notoires.

Je vais dorénavant écrire mes procédures dans ce sens.

Tu as bien d'autres solutions

à quoi fais-tu allusion ?, je ne demande qu'à apprendre.

Merci encore de m'avoir remis sur les rails, tes remarques sont toujours appréciées.

Je laisse le fil ouvert pour compléments éventuels.

Amicalement

Claude.

édit: merci également à Michel

Salut le forum

Tu peux utiliser une variable Flag dans un module standard

Public Flag As Boolean

Tu lui donne la valeur TRUE lorsque tu veux inhiber le EnableEvents

Et au début de tes codes un simple test

If Flag Then Exit Sub

Mytå

Bonsoir Mytå, bienvenue pour ton retour,

Pas sur d'avoir bien compris, voici un exemple concret que j'utilise fréquemment:

un 1er bouton qui me permet d'écrire dans une BDD contenant des "Private événement"

 Sub Ecriture()
Flag = True     '**remplace Application.EnableEvents = False
    ActiveWindow.DisplayHeadings = True
    Range("f:f").EntireColumn.Hidden = False
End Sub

puis un 2ème bouton remettant à l'état initial

Sub AfficherTout()
    ActiveWindow.DisplayHeadings = False
        With ActiveSheet
            On Error Resume Next
            .ShowAllData
            On Error GoTo 0
            .Range("b7:h7").ClearContents
            .Rows(8).Hidden = True
            .Range("f:f").EntireColumn.Hidden = True
            .Range("b7").Activate
        End With
Flag = False      '**remplace Application.EnableEvents = True
End Sub

ai-je bien placé les Flag ?

If Flag Then Exit Sub

là, je ne pige pas

c'est un contrôle pour sortir, si Flag n'est pas réactivé ?

merci de m'éclairer un peu +

Bonne soirée

Claude.

Re le forum

Claude, le code de contrôle tu le met dans tes événementielles.

Private Sub Worksheet_Change(ByVal Target As Range)
If Flag Then Exit Sub
'Reste du code
End Sub

Pour la disposition du Flag tu as bien compris le principe

Mytå

re,

ok, Je ne vois pas trop ce que çà change, mais je te fais confiance !

pour mon 2ème bouton, il faut bien mettre à la fin: Flag = False ?

je teste tout çà en vraie grandeur avant de solder le fil

Merci Mytå, tu m'a encore eu avec ton moucheron !!!

Claude.

Bonjour Claude,

Mets le FLAG à FALSE lorsque tu sors de la procédure sinon tant que ton fichier est ouvert il restera à TRUE.

Je ne vois pas trop ce que çà change

Si tu changes quelque chose sur ta feuille dans laquelle tu as une procédure WORKSHEET_CHANGE ou SELECTION, cela déclenchera automatiquement cette macro.

En mettant dans ton instruction FLAG, la macro sera aussi exécutée mais tu sortiras directement par le EXIT SUB.

En gros il faut bien savoir l'ordre de tes codes et surtout ce qui se passe dans tes codes pour pouvoir placer cette instruction correctement.

Amicalement

Dan

Bonjour Dan, à tous,

Merci Dan pour ton intervention,

Pour illustrer nos propos, deux questions sur ce code (liste validation)

et voir si j'ai bien assimilé.

1) Avant, dans ce Private je n'avais qu'un Call ….

j'ai ramené le code macro dans le Private et supprimé la macro,

est-ce une bonne idée ?

2) Vois-tu des anomalies dans ce code remanié ?

Private Sub Worksheet_Change(ByVal Target As Range)
If Flag Then Exit Sub       '**liste date
    If Not Application.Intersect(Target, Range("b7")) Is Nothing Then
        Application.ScreenUpdating = False
        If Range("b1") = 0 Then
                MsgBox ("rien ce jour !")
            Flag = True
                Target.ClearContents
                On Error Resume Next
                ActiveSheet.ShowAllData
                On Error GoTo 0
            Flag = False
                Exit Sub
        End If

        Range("Base").AdvancedFilter Action:=xlFilterInPlace, _
        CriteriaRange:=Range("b6:b7"), Unique:=False
        Range("e3:h3").ClearContents 'Tel
        Application.Goto Range("a9"), Scroll:=True
        Range("b7").Activate
    End If
End Sub

Bonne journée

Claude.

Re,

1) Avant, dans ce Private je n'avais qu'un Call …est-ce une bonne idée ?

Tu peux toujours mettre le code dans la feuille mais il ne faut pas supprimer la feuille par mégarde évidemment.

Dans un module tu es toujours sûr qu'il y restera.

2) Vois-tu des anomalies dans ce code remanié ?

Essaie plutôt ceci :

Dim flag As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If flag Then Exit Sub       '**liste date
    If Not Application.Intersect(Target, Range("b7")) Is Nothing Then
    flag = True
        Application.ScreenUpdating = False
        If Range("b1") = 0 Then
                MsgBox ("rien ce jour !")
            flag = True
                Target.ClearContents
                On Error Resume Next
                ActiveSheet.ShowAllData
                On Error GoTo 0
        End If
        Range("Base").AdvancedFilter Action:=xlFilterInPlace, _
        CriteriaRange:=Range("b6:b7"), Unique:=False
        Range("e3:h3").ClearContents 'Tel
        Application.Goto Range("a9"), Scroll:=True
        Range("b7").Activate
    flag = False
    End If
End Sub

Amicalement

Dan

re,

Merci Dan,

excuse-moi d'insister mais j'ai du loupé un épisode !

Quel est l'avantage de ce "Flag = True" par rapport à un "Application.EnableEvents = False" ?

Amicalement

Claude.

Re,

Quel est l'avantage de ce "Flag = True" par rapport à un "Application.EnableEvents = False" ?

je pense que tu n'as pas saisit mon explication dans un post précédent.

Application.EnableEvents = False suspend les procédures événementielles dans excel tandis que FLAG pas.

FLAG est une variable "public" qui se met à 1 lorsque tu la déclares VRAI dans ton code.

D'autre part, la suspension des événements est appliquée à Excel et non à un fichier. L'utilisation de Enableevents est donc à prendre avec prudence.

L'avantage de Flag est que tu n'agis pas sur excel mais sur une variable que tu décides de mettre à 1 ou à 0. Un plantage à ce niveau n'a pas d'incidence sur le fonctionnement d'excel tandis qu'un plantage avec Enableevents suspendra tous les événements d'excel.

Amicalement

Dan

re Dan, à tous,

Suffit pas d'appliquer tel ou tel code sans savoir le pourquoi du comment !

quitte à faire répéter.

Là, ton explication claire me satisfait pleinement et répond à mes interrogations.

message reçu 5 sur 5.

Je vais généraliser cette variable sur mes prochains fichiers. (avec modération)

Encore merci à toi, Michel, cousinhub et Mytå

Amicalement

Claude.

Rechercher des sujets similaires à "vba thisworkbook enableevents"