Protegendo células no Excel, mas permitindo que elas sejam modificadas pelo script VBA

Eu estou usando o Excel onde determinados campos são permitidos para input do usuário e outras células devem ser protegidas. Eu usei a folha Tools Protect, no entanto, depois de fazer isso, não consigo alterar os valores no script VBA. Eu preciso restringir a planilha para interromper a input do usuário, ao mesmo tempo, permitir que o código do VBA altere os valores da célula com base em determinados cálculos.

Tente usar

Worksheet.Protect "Password", UserInterfaceOnly := True 

Se o parâmetro UserInterfaceOnly estiver definido como true, o código VBA poderá modificar as células protegidas.

Você pode modificar uma planilha via código, tomando essas ações

  • Desproteger
  • Modificar
  • Proteger

No código isso seria:

 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 

A fraqueza desse método é que, se o código for interrompido e o tratamento de erros não o capturar, a planilha poderá ficar em um estado desprotegido.

O código poderia ser melhorado tomando essas ações

  • Re-proteger
  • Modificar

O código para fazer isso seria:

 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 

Esse código renova a proteção na planilha, mas com o ‘UserInterfaceOnly’ definido como true. Isso permite que o código do VBA modifique a planilha, mantendo a planilha protegida da input do usuário por meio da interface do usuário, mesmo se a execução for interrompida.

Essa configuração é perdida quando a pasta de trabalho é fechada e reaberta. A proteção da planilha ainda é mantida.

Portanto, o código “Reproteção” precisa ser incluído no início de qualquer procedimento que tente modificar a planilha ou pode ser executado apenas uma vez quando a pasta de trabalho for aberta.

Eu não acho que você pode definir qualquer parte da folha para ser editável apenas pelo VBA , mas você pode fazer algo que tem basicamente o mesmo efeito – você pode desproteger a planilha no VBA antes de precisar fazer alterações:

 wksht.Unprotect() 

e proteja novamente depois de terminar:

 wksht.Protect() 

Edit: Parece que esta solução pode ter resolvido o problema imediato de Dheer, mas para qualquer um que se deparar com esta questão / resposta mais tarde, eu estava errado sobre a primeira parte da minha resposta, como Joe aponta abaixo. Você pode proteger uma folha para ser editável apenas pelo VBA, mas parece que a opção “UserInterfaceOnly” só pode ser definida ao chamar “Worksheet.Protect” no código.

Uma resposta básica, mas simples de entender:

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

Como solução alternativa, você pode criar uma planilha oculta , que manteria o valor alterado. A célula na planilha visível e protegida deve exibir o valor da planilha oculta usando uma fórmula simples.

Você poderá alterar o valor exibido através da planilha oculta , enquanto seus usuários não poderão editá-lo.

Selecionei as células que queria bloquear na planilha1 e coloquei o código sugerido na function open_workbook () e trabalhei como um encanto.

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