59 votes

Comment protéger les cellules dans Excel, mais de permettre à ces être modifié par le script VBA

Je suis à l'aide d'Excel dont certains champs sont autorisés pour la saisie de l'utilisateur et d'autres cellules doivent être protégées. J'ai utilisé des Outils de Protéger la feuille, cependant après avoir fait cela, je ne suis pas en mesure de modifier les valeurs dans le script VBA. J'ai besoin de restreindre la feuille pour arrêter la saisie de l'utilisateur, dans le même temps permettre le code VBA pour modifier les valeurs des cellules en fonction sur certains calculs.

90voto

Joe Points 60749

Essayez d'utiliser

Worksheet.Protect "Password", UserInterfaceOnly := True

Si le UserInterfaceOnly paramètre est défini sur true, le code VBA peut modifier les cellules protégées.

16voto

Robert Mearns Points 5127

Vous pouvez modifier une feuille via le code en prenant ces mesures

  • Ôter la protection de la
  • Modifier
  • Protéger

Dans le code, ce serait:

Sub UnProtect_Modify_Protect()

  ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

  ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect

End Sub

La faiblesse de cette méthode est que si le code est interrompue et le traitement des erreurs à ne pas le capturer, la feuille de calcul pourrait être laissé dans un état non protégé.

Le code pourrait être améliorée par la prise de ces actions

  • Re-protéger
  • Modifier

Le code pour le faire serait:

Sub Re-Protect_Modify()

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
 UserInterfaceOnly:=True
'Protect, even if already protected

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

End Sub

Ce code renouvelle la protection de la feuille de calcul, mais avec le ‘UserInterfaceOnly' définie sur true. Cela permet de code VBA pour modifier la feuille de calcul, tout en gardant la feuille de calcul protégée de la saisie de l'utilisateur via l'INTERFACE utilisateur, même si l'exécution est interrompue.

Ce paramètre est perdu lorsque le classeur est fermé et ré-ouvert. La protection de feuille de calcul est toujours maintenu.

De sorte que le "Re-protection", le code doit être inclus au début de toute procédure visant à modifier la feuille de calcul ou peut-être simplement exécuter une seule fois lorsque le classeur est ouvert.

2voto

kcrumley Points 2495

Je ne pense pas que vous pouvez définir n'importe quelle partie de la feuille, pour être modifiable uniquement par VBA, mais vous pouvez faire quelque chose qui est fondamentalement le même effet: vous pouvez ôter la protection de la feuille de calcul dans VBA avant de vous besoin de faire des changements:

wksht.Unprotect()

et re-protéger lorsque vous avez terminé:

wksht.Protect()

Edit: on dirait que cette solution de contournement peut avoir résolu Dheer du problème immédiat, mais pour toute personne qui vient à travers cette question/réponse plus tard, je me suis trompé sur la première partie de ma réponse, comme Joe points ci-après. Vous pouvez protéger une feuille pour être modifiable par VBA seule, mais il semble que le "UserInterfaceOnly" option ne peut être réglé lors de l'appel de "Feuille de calcul.Protéger" dans le code.

2voto

Dalmango Points 19

Basique mais simple à comprendre réponse:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X