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 Sub

Je 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 Sub

Cdlt

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 Sub

Merci, 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

Rechercher des sujets similaires à "deverrouiller puis reverrouiller propriete locked"