web-dev-qa-db-fra.com

Comment protéger le classeur Excel avec VBA?

Avec un déclencheur comme une case à cocher, je souhaite protéger mon carnet de travail. J'ai essayé Excel 2003:

thisworkbook.protect("password",true,true)

thisworkbook.unprotect("password")

Ça ne fonctionne pas. Aucune suggestion?

6
Ravi

Je suis d'accord avec @Richard Morgan ... ce que vous faites devrait fonctionner, donc plus d'informations peuvent être nécessaires.

Microsoft a des suggestions sur les options pour protéger vos feuilles de calcul Excel 2003 .

Voici un peu plus d'infos ...

À partir des fichiers d’aide (méthode Protect):

expression.Protect(Password, Structure, Windows)

expression Obligatoire. Une expression qui retourne un objet Workbook.

Variable optionnelle du mot de passe. Chaîne spécifiant un mot de passe sensible à la casse pour la feuille de calcul ou le classeur. Si cet argument est omis, vous pouvez déprotéger la feuille de calcul ou le classeur sans utiliser de mot de passe. Sinon, vous devez spécifier le mot de passe pour déprotéger la feuille de calcul ou le classeur. Si vous oubliez le mot de passe, vous ne pouvez pas déprotéger la feuille de calcul ou le classeur. C'est une bonne idée de conserver une liste de vos mots de passe et des noms de documents correspondants dans un endroit sûr.

Variante optionnelle de structure. True pour protéger la structure du classeur (la position relative des feuilles). La valeur par défaut est False.

Variante facultative de Windows. True pour protéger les fenêtres du classeur. Si cet argument est omis, les fenêtres ne sont pas protégées.

ActiveWorkbook.Protect Password:="password", Structure:=True, Windows:=True

Si vous voulez travailler au niveau de la feuille de calcul, j'ai utilisé quelque chose de similaire il y a des années lorsque j'avais besoin de protéger/déprotéger:

Sub ProtectSheet()
    ActiveSheet.Protect "password", True, True
End Sub

Sub UnProtectSheet()
    ActiveSheet.Unprotect "password"
End Sub

Sub protectAll()
    Dim myCount
    Dim i
    myCount = Application.Sheets.Count
    Sheets(1).Select
    For i = 1 To myCount
        ActiveSheet.Protect "password", true, true
        If i = myCount Then
            End
        End If
        ActiveSheet.Next.Select
    Next i
End Sub
7
Edward Leno

Pour verrouiller tout le classeur depuis son ouverture, l'option Thisworkbook.password peut être utilisée dans VBA.

Si vous souhaitez protéger les feuilles de calcul, vous devez d'abord verrouiller les cellules avec l'option Thisworkbook.sheets.cells.locked = True, puis utiliser l'option Thisworkbook.sheets.protect password:="pwd".

Recherchez principalement ces mots clés: Thisworkbook.password ou Thisworkbook.Sheets.Cells.Locked

1
KumaraPush
  1. dans votre exemple de code, vous devez supprimer les crochets, car il ne s'agit pas d'une tâche fonctionnelle; aussi pour des raisons documentaires, je vous suggère d'utiliser la notation := (voir exemple de code ci-dessous)

    1. Application.Thisworkbook fait référence au livre contenant le code VBA, pas nécessairement le livre contenant les données, alors soyez prudent.

Exprimez la feuille sur laquelle vous travaillez en tant qu'objet de feuille et transmettez-la avec une variable logique au sous-objet suivant: 

Sub SetProtectionMode(MySheet As Worksheet, ProtectionMode As Boolean)

    If ProtectionMode Then
        MySheet.Protect DrawingObjects:=True, Contents:=True, _
                        AllowSorting:=True, AllowFiltering:=True
    Else
        MySheet.Unprotect
    End If
End Sub

Dans la méthode .Protect, vous pouvez définir ce que vous souhaitez autoriser/interdire. Ce bloc de code activera/désactivera la protection - sans mot de passe dans cet exemple, vous pouvez l'ajouter en tant que paramètre ou codé en dur dans le Sub. Quoi qu'il en soit, quelque part, le PW sera codé en dur. Si vous ne le souhaitez pas, appelez simplement la fenêtre Protection Dialog et laissez l’utilisateur décider quoi faire:

Application.Dialogs(xlDialogProtectDocument).Show

J'espère que cela pourra aider

Bonne chance - MikeD

1
MikeD