Detection des protections de feuilles

Bonjour,

Je me suis lancé il y a peu dans le VBA pour Excel.

J'ai développé un programme qui fonctionne bien et il me reste une fonction a créer.

J'aimerai qu'une fonction scrute l'état des protections de mes feuilles (dans le même classeur) et que cette fonction, selon son retour, modifie l'apparence d'un bouton et/ou d'une variable

En détail :

J'ai 3 feuilles (1 base de données, 1 de travail et 1 de recopie de certaines informations) qui en principe sont toutes protégées. Il faudrait que la fonction vérifie qu'elle le sont bien

  • si c'est le cas, sur la feuille de travaille affiche un bouton avec l'inscription "Déverrouiller" (ce bouton lancerait une userform qui m'invite à saisir le mot de passe)
  • si l'une des feuille n'est pas protégée, le même bouton devra afficher "Verrouiller" (il m'enverra vers une userform pour saisir le mot de passe)
Bien sûr, pas que au lancement mais durant toute l'utilisation du fichier. (donc une vérif sur des événements clef ; a moins que l'on puisse scruter l'action sur les boutons "Protéger la feuille" et "Oter la protection de la feuille" du menu Excel)

Merci d'avance pour votre aide

Bonjour,

voici un exemple,

Sub test()
Dim x As Integer, f
For Each f In Worksheets
 If f.Protect Then x = x + 1
Next
If x = Worksheets.Count Then UserForm1.Show 0
End Sub
sabV a écrit :

Bonjour,

voici un exemple,

Sub test()
Dim x As Integer, f
For Each f In Worksheets
 If f.Protect Then x = x + 1
Next
If x = Worksheets.Count Then UserForm1.Show 0
End Sub

Bonsoir sabV

Merci pour cette réponse rapide.

Etant débutant, peux tu m'expliquer le code proposé

Je vois que dans la seconde formule If, tu renvoies vers UserForm1 hors moi c'est le Commandbutton que je souhaite faire changer d'aspect, lequel lancera la UserForm.

Merci d'avance

il faudrait plus de précision sur le bouton,

est ce une forme (rectangle), un bouton de formulaire, un controle commandbutton ?

quel est le nom de la feuille contenant le bouton ?

sabV a écrit :

il faudrait plus de précision sur le bouton,

est ce une forme (rectangle), un bouton de formulaire, un controle commandbutton ?

quel est le nom de la feuille contenant le bouton ?

Re,

Alors j'ai un classeur qui comporte 3 feuilles.

  • La première est la base de données
  • La seconde est la feuille sur laquelle on remplit le tableau excel et sur laquelle j'ai créé des boutons via le menu Développeur\Insérer\Contrôles ActiveX\Bouton de commande (Contrôles ActiveX)
Il s'agit donc de "CommandButton"

- la troisième, une feuille qui recopie une partie des éléments saisis dans un document prêt à imprimer pour le destinataire

Donc sur la seconde feuille, je voudrais que un des "CommandButton" change d'aspect si 1, 2 ou les 3 feuilles n'est (ne sont) pas protégée(s).

  • Si les 3 feuilles sont verrouillées il présentera le texte "Déverrouiller"
  • Si 1, 2 ou l'ensemble des feuilles n'est (ne sont) pas verrouillée(s), il présentera l'indication "Verrouiller"
Ce CommandButton lancera un UserForm qui :
  • soit déverrouillera l'ensemble des feuilles (si les 3 sont verrouillées)
  • soit verrouillera une ou l'ensemble des feuilles.

J'espère avoir été clair.

Merci de votre aide et désolé si je m'explique mal.

Bonjour,

Ce n'est pas détectable. Il faudrait donc une macro qui recontrôle toutes les secondes l'état des feuilles.

(sauf si l'utilisateur ne le fait jamais manuellement. Si c'est toujours par macro tu ajoutes une ligne)

Bien compliqué pour ce que tu veux.

Sur le clic sur le bouton tu contrôle les feuilles, selon le résultat tu proposes Verrouiller ou Déverrouiller avec Oui/Non en choix.

eric

Bonjour Chris77400, eriiic, le forum,

Chris77400, je suis d'accord avec ce que eriiic as dit,

en plus il faut faire la différence entre la notion de Verrouiller ou Déverrouiller et Protection.

Verrouiller ou Déverrouiller s'applique aux cellules de la feuille et non à la feuille.

Protection s'applique à la feuille,

c'est à dire que si la feuille est protégée,

chacune de ses cellules étant déverrouillées peut être modifiées même si la feuille est protégée,

mais chacune de ses cellules étant verrouillées ne peut être modifiées si la feuille est protégée.

aussi il n'est pas possible de vérifier si une feuille est protégée,

car en exécutant la commande suivante:

If Worksheets(i).Protect Then

on protège automatiquement la feuille avec un mdp vide "".

si tu nous disais à quoi tu pense, quel est but final à atteindre, il serait peut-être plus facile pour nous de t'aider.

Chris77400, voici quelques notions sur la protection et déprotection qui, je l'espère, te serons utile.

Sub Protege()
Dim f
  With Sheets("Feuil2")
    .CommandButton1.Caption = "DéVerrouiller"
    .CommandButton2.Caption = "DéVerrouiller"
    .CommandButton3.Caption = "DéVerrouiller"
  End With

'il y a plusieurs options de protection de la feuille de calcul
'à vous de voir si chacun d'eux doit être à: True ou False
For Each f In Worksheets
    f.Protect Password:="", _
    DrawingObjects:=False, _
    Contents:=True, Scenarios:=False, _
    AllowFormattingCells:=True, _
    AllowFormattingColumns:=True, _
    AllowFormattingRows:=True, _
    AllowInsertingColumns:=True, _
    AllowInsertingRows:=True, _
    AllowInsertingHyperlinks:=True, _
    AllowDeletingColumns:=True, _
    AllowDeletingRows:=True, _
    AllowSorting:=True, _
    AllowFiltering:=True, _
    AllowUsingPivotTables:=True
 Next
End Sub

Sub DéProtege()
Dim f
  With Sheets("Feuil2")
    .CommandButton1.Caption = "Verrouiller"
    .CommandButton2.Caption = "Verrouiller"
    .CommandButton3.Caption = "Verrouiller"
  End With

For Each f In Worksheets
    f.Unprotect Password:=""
 Next
End Sub

Sub CheckProtection()
    'Vérifiez la possibilité de l'option de protection AllowDeletingColumns
    'sauf que si vous avez auparavant protégé la feuille avec cette option à true,
    'et que, même si maintenant la feuille n'est pas protégée, la vérification sera vrai.
    'amha ce n'est pas très utile

    If ActiveSheet.Protection.AllowDeletingColumns = True Then
        MsgBox "La modification <Supprimer une colonne> n'est pas possible."
    End If

    'les autres possibilitées sont:
    'AllowDeletingRows
    'AllowFiltering
    'AllowFormattingCells
    'AllowFormattingColumns
    'AllowFormattingRows
    'AllowInsertingColumns
    'AllowInsertingHyperlinks
    'AllowInsertingRows
    'AllowSorting
    'AllowUsingPivotTables
End Sub

Bonjour eriiic, sabV, le forum,

Merci pour vos réponse.

Donc ce que je veux n'est pas possible, du moins en vérification permanente. Je vais donc m'orienter vers une autre méthode, plus binaire et certainement moins lourde pour Excel.

Merci pour votre aide.

Bonjour,

tout ça c'est pour éviter un clic-droit dans le nom d'onglet ou il y a une autre idée derrière ?

Tu peux mettre le caption à jour sur le clic quand tu protèges ou déprotèges.

Si la personne l'a fait manuellement et bien il y aura un déphasage mais l'action exécutée correspondra bien au caption affiché. A lui de re-cliquer si besoin.

Sinon une fonction pour tester :

Function isProtected(sh As Worksheet) As Boolean
    Dim memo As Boolean
    memo = sh.[A1].Locked
    On Error GoTo erreur
    sh.[A1].Locked = Not memo
    memo = sh.[A1].Locked
    Exit Function
erreur:
    isProtected = True
    memo = sh.[A1].Locked
End Function

dans la mesure où .Protect UserInterfaceOnly:=True n'a pas été utilisé. C'est l'état vu de VBA qu'on a

eric

L'idée était de "Protéger" toutes les feuilles avec une seule opération plutôt que de répéter l'opération sur chaque feuille ou l'inverse de retirer la protection en 1 fois (sachant que pour le moment je protège toutes mes feuilles avec le même mot de passe)

Rechercher des sujets similaires à "detection protections feuilles"