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

Bonjour lo,
à déplacer sur l'événement BeforeClose du classeur en testant si la plage est verrouillée. Comme ceci
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If (.Range("MesureTransfere").Locked = False) Or (.ProtectContents = False) Then
            .Unprotect
            .Range("MesureTransfere").Locked = True
            .Protect
        End If
    End With
End Sub

A noter que, lors de la fermeture, il sera systématiquement proposé de sauvegarder les modifications.

J'ai repris votre code, où il y a 2 actions :
1- Protection de la feuille
2- Verrouillage de la plage "MesureTransfere".

Quelques remarques :
Par défaut, les cellules, pas seulement votre plage sont verrouillées mais restent modifiables tant que la feuille n'est pas protégée.
Mais c'est peut-être votre souhait de toujours verrouiller la plage (au cas où elle aurait été déverrouillée ?)
Dans le titre de la discussion, vous avez indiqué "cellules non vides", ce qui n'est pas repris dans votre texte ... ni dans ma proposition de code
1701764610619.png
 
Dernière édition:
Merci, pour votre remarque concernant le non vide c'est cela le plus important.

En fait j'aimerai que les mesures soit protégées lors de la fermeture et que les cellules vides du second tableau ne sont pas protégées afin de faire un transfert sur la feuille par une autre personne plus tard dans la journée. Il y aura plusieurs tableau sur la même feuille.
 
Le code en remplacement et quelques explications

VB:
Dim MAJ As Boolean
    With Sheets("Feuil1")
        For Each cell In .Range("MesureTransfere")
            Select Case True
                Case cell.Locked = False And Not (IsEmpty(cell))
                    Locked = True
                Case cell.Locked = True And IsEmpty(cell)
                    Locked = False
            End Select
        Next
        MAJ = False
        For Each cell In .Range("MesureTransfere")
            If cell.Locked = True Then
                MAJ = True
            End If
        Next
        If MAJ And Not (.ProtectContents) Then
              .Protect
        End If
    End With

Les différents test concernent TOUTES les cellules de la plage nommée
si cellule verrouillée ET vide => on déverrouille la cellule
si cellule déverrouillée ET non vide => on verrouille la cellule
PUIS
Si une cellule de la plage est verrouillée ET la feuille n'est pas protégée => on protège la feuille
 
Plus propre
Code:
Dim MAJ As Boolean
    With Sheets("Feuil1")
        For Each cell In .Range("MesureTransfere")
            Select Case True
                Case cell.Locked = False And Not (IsEmpty(cell))
                    Locked = True
                Case cell.Locked = True And IsEmpty(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
 
Voici ce que j'ai dans Thisworkbook. Les données du premier tableau ne sont pas protégées. Désolé, je fais peut être mal les choses.

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))
                    Locked = True
                Case cell.Locked = True And IsEmpty(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
 

Pièces jointes

Un erreur de ma part dans le code précédent (Locked au lieu de Cell.Locked)
Case cell.Locked = False And Not (IsEmpty(cell))
Locked = True
Case cell.Locked = True And IsEmpty(cell)
Locked = False


voici le code correct
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))
                    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("MesureTransfere")
                If cell.Locked = True Then
                    MAJ = True
                End If
            Next
            If MAJ Then
                  .Protect
            End If
        End If
    End With
End Sub
 
Dernière édition:
Merci pour votre patience, mais est-ce qu'il faut enlever les et dans mon code ?
VB:
 [B] [/B]
prendre le code de ma dernière réponse.
J'ai voulu mettre en gras ce que j'avais ajouté mais dans le code çà a généré un B entre crochets , je m'en suis aperçu après avoir répondu puis corrigé mais vous deviez avoir récupéré le code avec entretemps
 
- 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
233
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
250
Réponses
32
Affichages
1 K
Réponses
16
Affichages
1 K
Réponses
0
Affichages
538
Retour