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 :

Enchainement procédures évènementielles


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut Enchainement procédures évènementielles
    Bonsoir,

    Voilà, je voudrais en apprendre un peu plus sur les procédures évènementielles.
    J'ai un classeur avec beaucoup de feuilles et je voulais que lorsqu'on le ferme ou que l'on clique sur Sauvegarder, que toutes les feuilles soient protégées avant d'enregistrer.
    Alors, sachant que l'évènement BeforeClose s'exécute avant BeforeSave, j'ai mis ça dans le module ThisWorkbook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
        If Not Me.Saved Then
            proteger ' une procedure qui protege toutes les feuilles
        End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
        If Not Me.Saved Then
            Me.Save
        End If
    End Sub
    J'ai pensé qu'en faisant cela,
    - si on clique sur Sauvegarder, les feuilles vont etre protegees (là ça marche pas de problème)
    - si on ferme le classeur : BeforeClose s'exécute, ensuite Me.Save va appeler BeforeSave qui va proteger mes feuilles et sauvegarder le classeur, et du coup l'utilisateur ne sera pas invité à le faire (la sauvegarde).

    Mais il semble que ça ne marche pas tout à fait comme ça puisque en rouvrant mon classeur les feuilles ne sont pas protégées (Excel ne propose pas d'enregister mais les modif. sont bien enregistrées sauf pour la protection !)

    Alors depuis j'ai réglé le problème en faisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
        If Not Me.Saved Then
            proteger ' une procedure qui protege toutes les feuilles
        End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
        If Not Me.Saved Then
            proteger ' une procedure qui protege toutes les feuilles
            Me.Save
        End If
    End Sub
    Mais en fait, je voudrais bien comprendre comment ça marche vraiment !
    Parce que le premier raisonnement me semblait tellement logique ! et est ce qu'une instruction dans une procédure évènementielle peut appeler une autre procédure évènementielle (Save dans BeforeClose devrait appeler BeforeSave non ?!)


    Merci d'avance...

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut mondev et le forum
    Parce que le premier raisonnement me semblait tellement logique ! et est ce qu'une instruction dans une procédure évènementielle peut appeler une autre procédure évènementielle
    Non une procédure évènementielle n'est lancée que par l'évènement! Elle peut générer l'évènement, ce qui lance la procédure liée à cet évènement.

    Quand à ta logique... personnellement, je ne la comprends pas :
    Pourquoi mettre un test pour savoir s'il faut protéger ? ... alors que, si j'ai bien compris le sujet, tu veux toujours protéger : S'il y a test, il y a possibilité d'une réponse "False" et donc de ne pas effectuer les instructions. Donc je pense que mon raisonnement présente une faille par manque d'éléments.
    A+

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut 'Gorfael',

    Pourquoi mettre un test pour savoir s'il faut protéger ?
    Simplement parce que l'enregistrement prend un peu de temps et je veux éviter que, par exemple si on ouvre le classeur et qu'on ne change rien alors pas la peine de re-enregisitrer et re-protéger les feuilles puisqu'elles le sont déjà !
    Il suffit que le classeur soit modifié une fois pour que les feuilles soient protégées.

    Non une procédure évènementielle n'est lancée que par l'évènement! Elle peut générer l'évènement, ce qui lance la procédure liée à cet évènement.
    Là, j'ai pas bien compris (en faite rien ) : Tu dis qu'elle peut générer l'évènement, alors "Save" qui se trouve dans BeforeClose devrait lancer BeforeSave qui est la procédure liée à l'évènement "sauvegarder" !?


    Bonne soirée...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut mondev et le forum
    Moi, je ferais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Me.Saved = False Then
        Me.Save
    End If
    End Sub
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        proteger ' une procedure qui protege toutes les feuilles
    End Sub
    Tu ne peux pas lancer une procédure automatique liée à un évènement : par exemple "Call Workbook_BeforeSave", provoquera une erreur. Par contre, tu peux utiliser une instruction (Save), qui lance la procédure de sauvegarde. Et comme la procédure de sauvegarde génère le lancement de la macro (si elle existe) "Workbook_BeforeSave", ça revient presque à la lancer manuellement.
    Tu dis qu'elle peut générer l'évènement, alors "Save" qui se trouve dans BeforeClose devrait lancer BeforeSave qui est la procédure liée à l'évènement "sauvegarder" !?
    Effectivement, si tu mets des point d'arrêt sur les 2 macros, et que tu fermes le fichier, tu verras que si la variable Saved est à false, l'instruction "Save" s'exécute et lance la macro Workbook_BeforeSave.
    Ne sachant pas comment (et quand) la variable Saved est mise à jour, et comme de toute façon quand on demande de sauver, si les pages ne sont pas protégées dans le classeur, il faut les protéger, puisqu'il écrasera l'ancien classeur, je ne me préoccupe plus du fait qu'il soit "Saved" ou non.

    En règle générale, j'essaie au maximum d'éliminer les variables que je ne maîtrise pas complêtement : Comment est mis à jour "Saved" ? Peut-être que le fait de déprotéger ne la modifie pas. Un peu comme les changements de format, qui ne sont pas considérés comme des modifications par Excel qui ne lance pas Worksheet_Change, ou comme la variable "SpecialCells(xlCellTypeLastCell)" qui et fixée à l'ouverture et n'est remise à jour (à ma connaissance) que pour augmenter la ligne ou la colonne, mais ne recalcule pas réellement la cellule à droite en bas de la plage réelle de travail (un peu chiant quand on supprime des lignes ou des colonnes ou qu'on efface des cellules et qu'on table dessus "LastCell" pour trouver la dernière ligne/colonne de la plage).
    A+

  5. #5
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 89
    Par défaut
    Salut,

    Mais c'est exactement ça le problème, ça ne marche pas !
    C'est étrange, en fait c'est comme s'il ignorait la protection !

    Essayons ça tu veux 'Gorfael' ? (si tu as le temps bien sur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        Sheets(1).Range("c2").Value = "test"
        Sheets(1).Select ' inutile je sais ! mais j'ai essaye tellement de trucs !!!
        ActiveSheet.Protect
    End Sub
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Me.Save
    End Sub
    Et bah là, à l'ouverture du classeur, on a bien "test" dans la cellule "C2" mais la feuille n'est pas protégée !


    Bizarre.
    A vous...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut mondev et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        Sheets(1).Range("c2").Value = "test"
        Sheets(1).Protect
    End Sub
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Me.Save
    End Sub
    Version d'Excel ?

    Quand tu fais ton test, la macro "Workbook_BeforeSave" est bien lancé, puisque C2 est renseignée => ton enchaînement s'effectue correctement. Plus la peine de rechercher une panne de ce côté.

    Reste ta manière de protéger. Et si je radote des trucs que tu connais, tant pis :

    Fias une macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
        Sheets(1).Protect
    End Sub
    Lances-la en pas-à-pas et tegarde le résultat.

    La protection a besoin de 2 choses :
    – Que la propriété "Verrouillée/Locked" d'une plage soit à Vrai/True
    – Que la méthode "Protection/protect" de la feuille soit activée
    Bien que sous les version 2003 et précédentes les cellules soient verrouillées par défaut, vérifies.

    Vérifies aussi que tu n'ais pas une macro qui déverrouille à l'ouverture Ouais, je sais, ça à l'air bête, mais ça m'est déjà arrivé, en reprenant un fichier après plusieurs mois .

    Sinon, essaies de poster ton fichier d'essai, en xls (je n'ai que 2003).
    A+

Discussions similaires

  1. Procédure événementielle [Access+vb]
    Par Sly2k dans le forum Access
    Réponses: 4
    Dernier message: 18/07/2006, 14h04
  2. Procédure événementielle
    Par Laure88 dans le forum Access
    Réponses: 1
    Dernier message: 27/03/2006, 15h30
  3. Différence, exemple procédural, événementiel, objet ?
    Par ludophil dans le forum Débuter
    Réponses: 3
    Dernier message: 26/10/2005, 08h35
  4. comment appeler une procédure événementielle
    Par OutOfRange dans le forum Débuter
    Réponses: 8
    Dernier message: 03/06/2005, 19h32

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