Dévérrouiller puis reverrouiller une cellule avec la propriété Locked ?
Bonjour,
Grand débutant en VBA, j'ai bricolé une petite macro qui devait (en théorie) produire le résultat que je vais tenter de vous décrire ici. C'est une procédure évenementielle, le problème vient peut-être de là ? Si l'utilisateur sélectionne une cellule située dans une ligne en particulier (supérieure à la ligne 8 par exemple), je souhaite pouvoir affecter la valeur de la cellule A de la ligne sélectionnée à la cellule A4. Jusqu'ici, j'y arrive sans difficulté.
Là où cela se complique, c'est que je souhaite aussi pouvoir verrouiller la cellule A4 après lui avoir affecté cette valeur. Pour cela, j'ôte la protection de la feuille puis je tente de définir la propriété Locked de ma classe Range A4 sur Faux, j'affecte la valeur souhaitée à cette même cellule, puis je tente de redéfinir la propriété Locked du Range A4 sur Vrai et pour conclure je reprotège la feuille.
J'espèrais pouvoir ainsi rendre inéditable la cellule A4 une fois la feuille protégée, mais à la place je génère une "erreur d'exécution 1004": impossible de définir la propriété Locked de la classe Range.
Qu'est-ce qui pourrait bien clocher ?
J'ai exploré plusieurs pistes avant de vous solliciter. La cellule n'est pas fusionnée.
Voici mon code :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ligne As Integer
Dim MDP As String
MDP = "MDP"
ligne = Target.Row
If ligne > 8 Then
ActiveSheet.Unprotect MDP
Range("A4").Locked=False
Range("A4").Value = Range("A" & ligne).Value
Range("A4").Locked=True
ActiveSheet.Protect Password:=MDP, DrawingObjects:=True, Contents:=True
Else
Range("A4").Value = ""
End If
End SubJe suis curieux de découvrir vos propositions !
Merci d'avance!
Bonjour,
Essayez ceci:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ligne As Integer
Dim MDP As String
MDP = "MDP"
ligne = Target.Row
If ligne > 8 And Range("A4").Value = "" Then
ActiveSheet.Unprotect MDP
Range("A4").Locked = False
Range("A4").Value = Range("A" & ligne).Value
Range("A4").Locked = True
ActiveSheet.Protect Password:=MDP, DrawingObjects:=True, Contents:=True
End If
End SubCdlt
Bonjour,
Oui, comme Arturo le propose dans le cas de la condition, si ligne est inférieur à 8, vous allez tentez d'écrire sur une cellule qui est verrouillée.
Donc plusieurs solutions :
- Soit vous déverrouillez en début de procédure.
- Soit vous modifier la façon dont vous protégez les feuilles. exemple à l'ouverture du classeur :
Feuil.Protect Password:="MyPassword", UserIntrefaceOnly:=True
La deuxième solution ne protège que l'interface utilisateur et laisse libre le code de modifier ce qu'il veut.
Bonjour Jean-Paul,
Bonjour Arturo,
Merci pour votre aide. Au final, j'ai opté pour la solution de Jean-Paul, en mettant en place une petite procédure qui verrouille la feuille à l'ouverture.
Private Sub Workbook_Open()
Dim MDP As String
MDP = "MDP"
Sheets("Année facturation").Protect Password:=MDP, DrawingObjects:=True, UserInterfaceOnly:=True, Contents:=True
End SubMerci, c'est super, ça allège la consommation de ressources en bonus.
Pour la solution d'Arturo, la piste me paraissait intéressante. De ce que j'en ai compris, cela évoquait un éventuel conflit de verrouillage. Je n'ai pas réussi à creuser en revanche, car je maîtrise mal la procédure évènementielle au clic / la sélection. Mais par curiosité, j'y reviendrai plus tard.
Merci en tous cas pour votre aide à tous les deux.
Bien cordialement,
Guillaume