Avertir l'usager qu'il ôte la protection de la feuille

Résolu
Nai Messages postés 716 Date d'inscription   Statut Membre Dernière intervention   -  
Nai Messages postés 716 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde !

Je reviens à vous (et reviendrais probablement encore plus tard) pour un tout petit problème.

Toujours un lien avec ce sujet : https://forums.commentcamarche.net/forum/affich-30361189-afficher-les-enfant-de-moins-de-x-ans-uniquement#p30365885

Le séjour de juillet vient de débuter, et, inévitablement, la personne en charge du pointage (je suis en vacances) a fait quelques erreurs. De type : Ôter la protection => Copier une ligne => Insérer les cellules copiées. Du coup, en bas, les chiffres ne correspondaient plus. Dans mon fichier, c'est pas bien. L'utilisateur avait à sa disposition un bouton appelant une macro qui le faisait correctement, et bien plus vite... M'enfin.

La macro en question fait tout ça, rapidement. Je voudrais que :
Si l'utilisateur clique sur la macro => Pas de problème, pas d'avertissement.
Si l'utilisateur va dans "Révisions" puis clique sur "Ôter la protection de la feuille" => Avertissement, de type : "Soyez certain de ce que vous faites ! La modification d'une seule formule peut entraîner de graves erreurs !"
Oui, c'est dur, mais il faut bien ça :D

Je ne pense pas que le fichier soit nécessaire, mais s'il le faut, je le mettrais en ligne ;)

Ainsi, cela vous semble-t-il possible ?



Bien à vous,
Naï
ps: je surveille tous mes sujets non résolus, si solution vous avez, je la lirais à coup sûr :)

5 réponses

  1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    Il faudrait peut être mieux mettre un mot de passe qu'un avertissement !
    Comme cela pas possible de modifier intempestivement sauf "l'administrateur"

    Cdlmnt
    0
  2. Nai Messages postés 716 Date d'inscription   Statut Membre Dernière intervention   57
     
    Bonsoir Via,
    C'est déjà le cas en fait. La macro ôte la protection (avec mot de passe) et la remet à la fin (avec le même mot de passe). Lorsqu'on clique sur ôter la protection depuis l'onglet "Révisions", il demande le mot de passe. Logique. Le mot de passe est indiqué dans le premier onglet du tableau. Il y a parfois besoin de déverrouiller les feuilles. Mais je souhaite que lorsque cela est fait, l'utilisateur soit avertis.

    Par exemple, lorsque Excel demande le mot de passe, à côté ou sous le champ de saisie, ajouter le texte d'avertissement.

    Voir le fichier : https://www.cjoint.com/?0Givp4OT8gU
    0
    1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Malheureusement on ne peut rien rajouter à la procédure d'Excel

      La seule solution que je verrai serait :
      1) de protéger les feuilles par un mot de passe non divulgué
      2) d'associer une macro à un bouton sur les feuilles à déproteger qui afficherait dans une messagebox l'avertissement et demanderait confirmation de déprotéger puis déprotegerait la feuille en cas de réponse affirmative (comme le font déjà les macros de travail)
      3) une autre macro reprotegerait la feuille dès qu'on change de feuille (Worksheet Deactivate)
      4) par sécurité on peut prévoir une macro qui protège toutes les feuilles à protéger à l'ouverture du classeur (This Workbook Workbook Open)

      Cdlmnt
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour à tous,

    Comme dit via, on ne peut pas détecter la déprotection de la feuille.

    Une proposition qui scrute régulièrement si les feuilles listées sont protégées.
    Si une feuille est non protégée une boite de dialogue demande si on veut les re-protéger.
    Met le temps que tu juges le plus adéquat entre pouvoir travailler et être suffisament chiant pour que l'utilisateur finisse par dire Oui.
    Pour les tests j'ai mis 10 s.
    Je n'ai mis que 3 feuilles, complète la liste. Eventuellement ajoute des tests si les protections diffèrent (avec et sans mdp par exemple)
    Dans ThisWorkbook :
    Private Sub Workbook_Open()
        supervision
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        finSupervision
    End Sub

    Dans le module 4 :
    Option Explicit
    Option Private Module
    
    Dim m_nextTime As Date
    
    Sub supervision()
        Dim listeF, i As Long, j As Long, msg As String
        'Stop
        listeF = Array("Feuille de présence", "Moyennes", "Fréquentation globale")
        For i = 0 To UBound(listeF)
            If Not Sheets(listeF(i)).ProtectContents Then
                If MsgBox("Attention, certaines feuilles sont non protégées." & vbLf & "Les reprotéger ?", vbQuestion + vbYesNo, "Protection !!!") = vbYes Then
                    For j = 0 To UBound(listeF)
                        ActiveSheet.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                            , AllowInsertingColumns:=True, AllowInsertingRows:=True, _
                            AllowInsertingHyperlinks:=True
                    Next j
                    Exit For
                End If
            End If
        Next i
        m_nextTime = Now + TimeValue("00:00:10")
        Application.OnTime m_nextTime, "supervision"
    End Sub
    
    Sub finSupervision()
        ' arreter le timer
        On Error Resume Next
        Application.OnTime EarliestTime:=m_nextTime, Procedure:="supervision", Schedule:=False
    End Sub

    https://www.cjoint.com/?DGixlWoII8g

    eric
    0
  4. Nai Messages postés 716 Date d'inscription   Statut Membre Dernière intervention   57
     
    10 secondes me parait très bien :D
    Par contre, il y a un petit problème. J'ai eu beau ajouter toutes les feuilles dans le code du module 4, elles ne sont pas toutes protégées lorsque j'accepte de les reprotéger...

    Voici le code que j'ai dans le module 4 :
    Sub supervision()
    Dim listeF, i As Long, j As Long, msg As String
    'Stop
    listeF = Array("Feuille de présence", "Moyennes", "Fréquentation globale", "Fréquentation 4-5 ans", "Fréquentation 6-11 ans", "Fréquentation 12-17 ans", "Pourcentage S1", "Pourcentage S2", "Global")
    For i = 0 To UBound(listeF)
    If Not Sheets(listeF(i)).ProtectContents Then
    If MsgBox("Attention, certaines feuilles sont non protégées." & vbLf & "Les reprotéger ?", vbQuestion + vbYesNo, "Protection !!!") = vbYes Then
    For j = 0 To UBound(listeF)
    ActiveSheet.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True _
    , AllowInsertingColumns:=True, AllowInsertingRows:=True, _
    AllowInsertingHyperlinks:=True
    Next j
    Exit For
    End If
    End If
    Next i
    m_nextTime = Now + TimeValue("00:00:10")
    Application.OnTime m_nextTime, "supervision"
    End Sub

    Et le débogage me surligne au jaune :
                        ActiveSheet.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True _
    , AllowInsertingColumns:=True, AllowInsertingRows:=True, _
    AllowInsertingHyperlinks:=True

    Je n'ai pas réussi à mettre en forme le code comme toi Eriiic :/

    J'ai bien pensé à ajouter une virgule avec le dernier "True", sans succès. Pareil si j'y ajoute en plus le "_".

    En tout cas, tout cela me parait bien ! Le message qui avertis l'utilisateur qu'il travaille sur des feuilles non protégées, c'est ce qu'il me fallait !

    Si en plus je peux ajouter une macro qui protège une feuille au changement de feuille, c'est encore mieux :D

    Merci !
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      Je n'ai pas réussi à mettre en forme le code
      cliquer sur le menu déroulant à coté de l'icone <> et choisir basic

      elles ne sont pas toutes protégées
      Si tu avais dit lesquelles ça m'aurai fait gagner du temps.
      J'avais juste copié-collé ton code de protection, c'était toujours la même feuille. Corrigé
      De plus j'ai vu que les graphiques ne connaissent pas certains paramètres, j'ai ajouté un test. Reprend le code sur le fichier(module4).
      Mais toutes tes feuilles sont concernées ? Si oui tu peux enlever le test sur leur nom et chaque nouvelle feuille sera prise en compte automatiquement.

      Si en plus je peux ajouter une macro qui protège une feuille au changement de feuille, c'est encore mieux :D
      C'est 10 fois plus simple.
      Dans thisworkbook :
      Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
          If Sh.Type = xlWorksheet Then
              Sh.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                  , AllowInsertingColumns:=True, AllowInsertingRows:=True, _
                    AllowInsertingHyperlinks:=True
          Else ' Graph
              Sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
          End If
      End Sub

      J'ai fait pour toutes les feuilles. Si tu veux filtrer par noms ajoute-le.
      Tu peux modifier le msgbox de l'autre sub, seule la feuille active peut être non protégée maintenant.

      edit : https://www.cjoint.com/?DGjq0iQ49i7
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Nai Messages postés 716 Date d'inscription   Statut Membre Dernière intervention   57
     
    Merci tout plein ! :)
    0