Protéger les cellules dans Excel mais autoriser leur modification par un script VBA

StackOverflow https://stackoverflow.com/questions/125449

  •  02-07-2019
  •  | 
  •  

Question

J'utilise Excel où certains champs sont autorisés pour une entrée utilisateur et d'autres cellules doivent être protégées. J'ai utilisé la feuille de protection des outils, mais après cela, je ne suis pas en mesure de modifier les valeurs du script VBA. Je dois limiter la feuille pour empêcher les saisies de l'utilisateur, tout en autorisant le code VBA à modifier les valeurs des cellules en fonction de certains calculs.

Était-ce utile?

La solution

Essayez d'utiliser

Worksheet.Protect "Password", UserInterfaceOnly := True

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

Autres conseils

Vous pouvez modifier une feuille via un code en effectuant ces actions

  • Déprotéger
  • Modifier
  • Protéger

Dans le code, cela 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 interrompu et que la gestion des erreurs ne le capture pas, la feuille de calcul pourrait rester dans un état non protégé.

Le code pourrait être amélioré en prenant ces mesures

  • Re-protéger
  • Modifier

Le code pour ce 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 sur la feuille de calcul, mais avec le paramètre ‘UserInterfaceOnly’ défini sur true. Cela permet au code VBA de modifier la feuille de calcul tout en la protégeant contre les entrées de l'utilisateur via l'interface utilisateur, même en cas d'interruption de l'exécution.

Ce paramètre est perdu lorsque le classeur est fermé et rouvert. La protection de la feuille de calcul est toujours maintenue.

Il faut donc inclure le code "Re-protection" au début de toute procédure tentant de modifier la feuille de calcul ou ne pouvant être exécuté qu'une seule fois lorsque le classeur est ouvert.

Je ne pense pas que vous puissiez configurer une partie de la feuille pour qu'elle puisse être modifiée uniquement par VBA , mais vous pouvez faire quelque chose qui a essentiellement le même effet - vous pouvez déprotéger la feuille de calcul dans VBA. avant de devoir apporter des modifications:

wksht.Unprotect()

et protégez-le une fois que vous avez terminé:

wksht.Protect()

Modifier: on dirait que cette solution de contournement a peut-être résolu le problème immédiat de Dheer, mais pour quiconque rencontre cette question / réponse plus tard, je me suis trompé sur la première partie de ma réponse, comme le souligne Joe ci-dessous. Vous pouvez protéger une feuille pour qu'elle puisse être modifiée uniquement par VBA, mais le message " UserInterfaceOnly " Cette option ne peut être définie que lorsque vous appelez & Works; Worksheet.Protect " dans le code.

Une réponse simple mais simple à comprendre:

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

Pour contourner le problème, vous pouvez créer une feuille de calcul masquée , qui contiendrait la valeur modifiée. La cellule de la feuille de calcul visible et protégée doit afficher la valeur de la feuille de calcul masquée à l'aide d'une formule simple.

Vous pourrez modifier la valeur affichée via la feuille de calcul masquée , sans que vos utilisateurs puissent la modifier.

J'ai sélectionné les cellules que je voulais verrouiller dans la feuille Sheet1 et placé le code suggéré dans la fonction open_workbook () et j'ai travaillé comme un charme.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top