Microsoft 365 Aide pour code protection cellules non vides à la fermeture

  • Initiateur de la discussion Initiateur de la discussion lo-de
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

lo-de

XLDnaute Nouveau
Bonjour,

J'aimerai protéger les cellules d'un tableau à la fermeture du fichier.

J'ai fait un code pour la protection après saisie:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("MesureTransfere")) Is Nothing Then
        Me.Unprotect
        Target.Locked = True
        Me.Protect
    End If
End Sub

Mais je voudrais protéger les données qu'à la fermeture et non juste après la saisie, en laissant le tableau suivant accessible pour entrer les mesures.

Merci
 

Pièces jointes

Non, la macro s'appliquera à toutes les cellules de la plage nommée "MesureTransfere".
Si cela doit être étendu à d'autres cellules il faudra simplement les inclure dans la plage "MesureTransfere"
(Formules -> Gestionnaire des Noms -> sélectionner "MesureTransfere" ...
 
Bonjour, j'ai un soucis lors de l'ouverture du fichier après fermeture, la feuille est verrouillée donc je peux entrer les mesures, les mesures précédentes sont verrouillées. Mais dès que je veux fermer il y a un soucis, je dois oter la protection pour que cela fonctionne.
 
Bonjour, j'ai un soucis lors de l'ouverture du fichier après fermeture, la feuille est verrouillée donc je peux entrer les mesures, les mesures précédentes sont verrouillées. Mais dès que je veux fermer il y a un soucis, je dois oter la protection pour que cela fonctionne.

J'ai ajouté .unprotect pour déverouiller le temps de la macro:
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim MAJ As Boolean
    With Sheets("Feuil1")
        .Unprotect
            For Each cell In .Range("Mesure")
                Select Case True
                Case cell.Locked = False And Not (IsEmpty(cell))
                    cell.Locked = True
                Case cell.Locked = True And IsEmpty(cell)
                   cell.Locked = False
                End Select
            Next
            If Not (.ProtectContents) Then
                MAJ = False
                For Each cell In .Range("Mesure")
                    If cell.Locked = True Then
                        MAJ = True
                    End If
            Next
            If MAJ Then
                  .Protect
            End If
        End If
    End With
 
Bonjour,
excusez mon erreur, voici la correction et de nouvelles remarques :
- l'état normal des cellules de la plage est
si cellule vide, elle est déverrouillée
si cellule non vide elle est verrouillée
Donc, à la fermeture du fichier,
on vérifie toutes les cellules de la plage et le cas échéant on rétablit le verrouillage / déverrouillage (on déprotège la feuille si une rectification de verrouillage est à faire)​
Puis, si la feuille est déprotégée et s'il existe au moins une cellule de la plage verrouillée, on protège la feuille même si aucune rectification n'a été faite.​
Pour pouvoir travailler sur la feuille,
sur les cellules vides, aucun problème que la feuille soit protégée ou non​
sur les cellules non vides (ici blanc <> de vide), par exemple pour corriger une erreur de saisie, si la feuille est protégée, il faudra la déprotéger​

VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim MAJ As Boolean
    With Sheets("Feuil1")
        For Each cell In .Range("MesureTransfere")
            Select Case True
                Case cell.Locked = False And Not (IsEmpty(cell))
                    If .ProtectContents = False Then .Unprotect
                    cell.Locked = True
                Case cell.Locked = True And IsEmpty(cell)
                    If .ProtectContents = False Then .Unprotect
                    cell.Locked = False
            End Select
        Next
        If Not (.ProtectContents) Then
            MAJ = False
            For Each cell In .Range("MesureTransfere")
                If cell.Locked = True Then
                    MAJ = True
                End If
            Next
            If MAJ Then
                  .Protect
            End If
        End If
    End With
End Sub
 
Merci pour votre retour rapide.

Un dernière question si je veux faire sur plusieurs feuilles du même classeur, il faut ajouter les feuilles après With sheets= ("Feuil1")("Feuil2")("Feuil3")etc... ?
Biensur les cellules je les ajoute au range "MesureTransfere"
 
Merci pour votre retour rapide.

Un dernière question si je veux faire sur plusieurs feuilles du même classeur, il faut ajouter les feuilles après With sheets= ("Feuil1")("Feuil2")("Feuil3")etc... ?
Biensur les cellules je les ajoute au range "MesureTransfere"
Dans l'idée oui mais il faut ici dupliquer tout le pavé "With" "End With", les ajouter les uns au-dessous des autres en changeant simplement le nom de la feuille (et le nom du range si le nom est différent dans les autres feuilles)
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
229
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
234
Réponses
32
Affichages
1 K
Réponses
16
Affichages
964
Réponses
0
Affichages
532
Retour