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