Microsoft 365 Protect/Unprotect

FCMLE44

XLDnaute Impliqué
Supporter XLD
Bonjour

Dans ce code, j'ai placé des Unprotect ainsi que de Protect
VB:
Option Explicit

Private Sub ComboBox1_Change()

End Sub

Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
Unload Me
ActiveSheet.Protect
End Sub

Private Sub CommandButton3_Click()

ActiveSheet.Unprotect
Dim Choix%, ReponseIndem%, ReponseTP%
Dim fselection()
Dim TpsPart As Boolean
Dim Motif$

Choix = ComboBox1.ListIndex 'renvoie le choix sélectionné

'DEFINIT LES FEUILLES A IMPRIMER SELON LE CHOIX SELECTIONNE DANS USERFORM
Select Case Choix
'CHOIX INDEMNITE
    Case 0
        fselection = Array("Indemnités", "salariés") 'FEUILLES A IMPRIMER (A ADAPTER!)
        ReponseTP = MsgBox("Le salarié avait-il une période à temps partiel ?", vbYesNo, "Temps partiel") 'msg temps partiel
        Select Case ReponseTP
            Case vbNo: TpsPart = False 'si reponse non, variable TpsPart = faux
            Case vbYes: TpsPart = True 'si reponse oui, TpsPart = vrai
            Case Else: MsgBox "Procédure annulée !", , "Annulation": Exit Sub 'sinon, sortie procedure
        End Select
'CHOIX ENVOI SIMULATION
    Case 1
        fselection = Array("Simulations") 'feuille à imprimer
'CHOIX DOSSIER COMPLET
    Case 2
        ReponseIndem = MsgBox("AVEZ-VOUS CALCULE UNE INDEMNITE DE RUPTURE ?", vbYesNo, "Indemnités") 'msg indemnités
        Select Case ReponseIndem
            Case vbNo: fselection = Array("salariés", "DSN", "CP", "Courriers", "ES", "Asaisir") 'A ADAPTER (ici, sans "Indemnités" !!!) 'si non, feuilles sans "Indemn"
            Case vbYes
                fselection = Array("salariés", "Indemnités", "DSN", "CP", "Courriers", "ES", "Asaisir") 'si oui, feuilles avec "Indemn" PUIS :
                ReponseTP = MsgBox("Le salarié avait-il une période à temps partiel ?", vbYesNo, "Temps partiel") 'msg TP
                Select Case ReponseTP
                    Case vbNo: TpsPart = False 'voir cas 0
                    Case vbYes: TpsPart = True
                    Case Else: MsgBox "Procédure annulée !", , "Annulation": Exit Sub
                End Select
            Case Else: MsgBox "Procédure annulée !", , "Annulation": Exit Sub
        End Select
'CHOIX COURRIERS STC
    Case 3
        fselection = Array("Courriers") 'feuille à imprimer
'LISTE LAISSEE VIDE
    Case Else
        MsgBox "Procédure annulée, aucune donnée n'est renseignée!", vbCritical, "Erreur de sélection"
        Exit Sub 'sortie procédure
End Select

'EXECUTION DE LA MACRO EditionPDF (qui dépend du choix temps partiel)
Call EditionPDF(fselection, TpsPart) 'exécution EditionPDF (en fonction de fselection et de TpsPart)

'----------------LIGNES AJOUTEES------------------------
'-------------------------------------------------------
'-------------------------------------------------------
'ENVOI DU MAIL SOUS CONDITIONS
If Choix = 0 Then Call ChoixMultiFichiers_EnvoiMail_Simu_RG   'envoi mail sans condition si choix 0
If Choix = 1 Then Call ChoixMultiFichiers_EnvoiMail_SimuRH   'envoi mail sans condition si choix 1
If Choix = 2 Then 'si choix 2
    Motif = Join(Array("Licenciement Faute Grave", "Licenciement Autres", "Retraite", "Rupture Conventionnelle"))
    If InStr(Motif, Sheets("Salariés").Range("D18").Value) > 0 Or Sheets("Courriers").Range("E74").Value > 15000 Then
'si la cellule D18 de la feuille Salariés est = "Licenciement Faute Grave", "Licenciement Autres", "Retraite", "Rupture Conventionnelle" ou que la cellule E74 de la feuille Courriers est > à 15 000
        Call ChoixMultiFichiers_EnvoiMail_ValidSTC 'alors envoi systématique du mail via code ci-dessous
    End If
End If
'-------------------------------------------------------
'-------------------------------------------------------
'-------------------------------------------------------

'MSG POUR CONTINUER SUR UF OU FERMER
If Not MsgBox("Souhaitez-vous effectuer une autre action ?", vbYesNo, "Demande de confirmation") = vbYes Then 'si continuer non, on ferme
    Unload Me
    Exit Sub
End If

ComboBox1.ListIndex = -1 'si continuer oui, on définit la liste sur valeur vide
ActiveSheet.Protect
End Sub

Private Sub UserForm_Initialize()
ActiveSheet.Unprotect
  With Me.ComboBox1
    .AddItem "Validation Simulation indemnités de rupture"
    .AddItem "Envoi Simulation à la RH"
    .AddItem "Enregistrer mon dossier complet"
    .AddItem "Générer les courriers du STC"
  End With
ActiveSheet.Protect
End Sub

Il bloque lors de la sélection des feuilles

Sur ce feuilles aussi se trouve des Protect et Unprotect

Quelqu'un aurait il une idée de comment je pourrais faire ?

Merci
 

Roblochon

XLDnaute Barbatruc
Bonjour,

Ne mettez des protect QUE lorsque code va modifier une feuille et unprotect après.

Exemple d'endroit où cela n'a rien à faire :
VB:
Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
Unload Me
ActiveSheet.Protect
End Sub

On ne voit pas ce que cela vient faire ici.
Par contre , si dans l'évènement QueryClose ou Terminate de votre userForm, vous modifiez quelque chose dans votre feuille alors mettez-y vos UnProtect et Protect mais pas avant.

De façon générale essayez de regrouper au maximum, le code de modification de vos feuilles pour avoir le moins possible de protect et unprotect à mettre.

je ne peux pas vous en dire plus.

Cordialement
 
Dernière édition:

FCMLE44

XLDnaute Impliqué
Supporter XLD
Toutes mes feuilles sont protégées de la sorte pour éviter que les formules soient supprimées
Je ne peux le faire manuellement car j'ai pas mal de macros

Je pense que cela justifie que j'obtiens ce message d'erreur lorsque je sélectionne ces feuilles
1610525436326.png
 

Marcel32

XLDnaute Accro
C'est une option dans les paramètres de la fonction PROTECT.

Ça permet, comme je disais précédemment, de protéger la feuille pour l'utilisateur, mais pas pour VBA qui peut donc par exemple modifier une cellule sans avoir besoin de déprotéger la feuille.
 

Marcel32

XLDnaute Accro
Pour être peut-être plus clair, je dirai que ça permet à VBA de fonctionner comme s'il n'y avait pas de protection sur la feuille, mais pour l'utilisateur la feuille est protégée.

Avantage : plus besoin de jouer avec les PROTECT et UNPROTECT.

Éventuel inconvénient : si un utilisateur déprotège une feuille, il n'y a pas de "reprotection" comme tu le fais actuellement dans ton code VBA après chaque modification.

Mais ça simplifie tellement la vie du programmeur que c'est une chose à tester, à mon avis. ;)
 
Dernière édition:

FCMLE44

XLDnaute Impliqué
Supporter XLD
Donc si je comprends, il faut que je mette un code du genre

VB:
Sub Edit_Salariés()
    'Déprotège Feuille Salariés
    Worksheets("Salariés").Unprotect


    'Reprotège Feuille Salariés
    Worksheets("Salariés").Protect
End Sub

sur chaque feuille en enlevant tous mes ActiveSheet. Protect et Unprotect de mes codes se trouvant dans ces feuilles
 

Marcel32

XLDnaute Accro
Non, ce n'est pas exactement ça.

Tu peux protéger toutes tes feuilles à protéger par exemple lors de l'ouverture du classeur, et après tu n'as plus à t'occuper des protections des feuilles.
Ou tu peux protéger une feuille à chacune de ses activations.
C'est toi qui vois. ;)
 

Discussions similaires

Réponses
8
Affichages
179
Réponses
5
Affichages
134

Statistiques des forums

Discussions
287 410
Messages
1 883 423
Membres
162 895
dernier inscrit
Denis50
Haut Bas