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.
Réponses
Trop de publicités?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.
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.