web-dev-qa-db-fra.com

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

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 peux plus modifier les valeurs du script VBA. Je dois limiter la feuille pour empêcher les entrées utilisateur, tout en permettant au code VBA de modifier les valeurs des cellules en fonction de certains calculs.

51
Dheer

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.

83
Joe

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

  • Déprotéger
  • 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 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 faire cela 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.

Par conséquent, le code "Re-protection" doit être inclus au début de toute procédure tentant de modifier la feuille de calcul ou pouvant simplement être exécuté une fois lorsque le classeur est ouvert.

16
Robert Mearns

Je ne pense pas que vous puissiez configurer n'importe quelle partie de la feuille pour pouvoir être modifiée uniquement par VBAmais vous pouvez faire quelque chose qui a fondamentalement 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()

Edit: 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 uniquement pour être modifiable par VBA, mais il apparaît que l'option "UserInterfaceOnly" ne peut être définie que lorsque vous appelez "Worksheet.Protect" dans le code.

3
Kevin Crumley

Une réponse simple mais simple à comprendre:

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

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 changer la valeur affichée via la feuille de calcul masquée , alors que vos utilisateurs ne pourront pas la modifier.

1
hegemon

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

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
0
Alan