Accueil | Ce site | CV | Excel | Livre d’or | Macros XL4 | Modèles | VBA

 Les procédures Protege et Deprotege

Ces deux procédures, contenues dans le module MOutils, apportent une grande sécurité aux applications développées sous Excel avec VBA. Elles empêchent l’utilisateur de modifier un document Excel sans passer par les menus et/ou les zones de dialogue de l’application (cf. exemple).

Chaque traitement devant modifier un classeur Excel commence par le lancement de Deprotege, qui ôte la protection de toutes les feuilles du classeur et se termine par celui de Protege qui la rétablit avant que l’utilisateur ne récupère la main.

Cela évite la perte de données, ou la modification accidentelle de formule(s).

La procédure Protege

Voici le code permettant de protéger l’ensemble des feuilles d’un classeur :

Sub Protege()
Dim f as Worksheet
    For Each f In ActiveWorkbook.Worksheets
        f.Protect "Toto", True, True, True
    Next
End Sub

Le code est très simple, on définit une variable, “f”, comme étant un objet Worksheet (feuille de calcul). Puis on l’utilise pour parcourir la collection des objets Worksheet du classeur actif, à l’aide d’une boucle For Each … Next. Pour la structure du code, se reporter si nécessaire à l’étude de cette boucle.

Protect est une méthode de l’objet Worksheet. Le premier argument "Toto" représente le mot de passe, indiqué ici en clair. Les 3 arguments suivants correspondent aux éléments que l’on peut protéger au sein d’une feuille (figure 1).


Fig. 1 - Le dialogue permettant de protéger une feuille.

Si l’on veut éviter que le mot de passe (“Toto” dans l’exemple) soit clairement lisible en examinant le code, on peut protéger l’accès au code VBA, ou stocker le mot de passe utilisé pour protéger les feuilles en utilisant un nom pour le stocker (figure 2).


Fig. 2 - Utilisation d’un nom, “MotPasse”, pour stocker le mot de passe servant à protéger les feuilles

Voici une variante (ProtegeBis) du code qui va lire le mot de passe, en utilisant le nom tel qu’il est défini dans la figure 2 :

Sub ProtegeBis()
Dim f as Worksheet
    For Each f In ActiveWorkbook.Worksheets
       f.Protect ThisWorkbook.Sheets("Feuil1").Evaluate("MotPasse"), True, True, True
     Next
End Sub

On utilise ici la méthode Evaluate pour récupérer la chaîne de caractères correspondant au nom “MotPasse”.

La procédure Deprotege

Comme pour la procédure Protege, 2 variantes sont proposées ici. Deprotege utilise un mot de passe indiqué en clair dans le code VBA, tandis que DeprotegeBis utilise un nom.

Sub Deprotege()
Dim f as Worksheet
    For Each f In ActiveWorkbook.Worksheets
        f.Unprotect "Toto" 
    Next
End Sub

Contrairement à la méthode Protect, Unprotect n’a qu’un argument, le mot de passe. Il n’est pas possible d’agir seulement sur le contenu, les objets ou les scénarios (figure 1). La déprotection est globale.

Sub DeprotegeBis()
Dim f as Worksheet
    For Each f In ActiveWorkbook.Worksheets
       f.Unprotect ThisWorkbook.Sheets("Feuil1").Evaluate("MotPasse")
    Next
End Sub