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

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

  • Classeur1.xlsm
    16.5 KB · Affichages: 3

crocrocro

XLDnaute Impliqué
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:

lo-de

XLDnaute Nouveau
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.
 

crocrocro

XLDnaute Impliqué
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
 

crocrocro

XLDnaute Impliqué
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
 

lo-de

XLDnaute Nouveau
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

  • Classeur1.xlsm
    15.1 KB · Affichages: 1

crocrocro

XLDnaute Impliqué
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:

crocrocro

XLDnaute Impliqué
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
 

Discussions similaires

Réponses
32
Affichages
965

Statistiques des forums

Discussions
315 098
Messages
2 116 197
Membres
112 680
dernier inscrit
AKDS