Protegendo as células no Excel, mas permitir que estes sejam modificados por script VBA

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu estou usando o Excel em que determinados campos são permitidos para entrada do usuário e outras células devem ser protegidos. Eu tenho usado ferramentas folha de Protect, no entanto, depois de fazer isso, eu não sou capaz de alterar os valores no script VBA. Eu preciso para restringir a folha à entrada do usuário stop, ao mesmo tempo, permitir que o código VBA para alterar os valores de célula com base em certos cálculos.

Foi útil?

Solução

Tente usar

Worksheet.Protect "Password", UserInterfaceOnly := True

Se o parâmetro UserInterfaceOnly é definido como verdadeiro, o código VBA pode modificar células protegidas.

Outras dicas

Você pode modificar uma folha por meio de código, tomando essas ações

  • desproteger
  • Modificar
  • Protect

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

O fraqueza deste método é que, se o código for interrompida e manipulação de erro não capturá-lo, a planilha pode ser deixado em um estado desprotegido.

O código poderia ser melhorou por tomar essas ações

  • Re-protect
  • 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

Este código renova a proteção na planilha, mas com o conjunto ‘UserInterfaceOnly’ para true. Isso permite que o código VBA para modificar a planilha, mantendo a planilha protegido contra a entrada do usuário através da interface do usuário, mesmo se a execução é interrompida.

Esta definição é perdeu quando o livro é fechado e reaberto. A proteção de planilha ainda é mantida.

Assim, as necessidades de código 'Re-proteção' para ser incluído no início de qualquer procedimento que as tentativas para modificar a planilha ou pode apenas ser executado uma vez quando o livro é aberto.

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

wksht.Unprotect()

e re proteger-lo depois que você está feito:

wksht.Protect()

Editar: parece que esta solução alternativa pode ter resolvido problema imediato de Dheer, mas para quem se depara com esta pergunta / 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 por VBA-only, mas parece que a opção "UserInterfaceOnly" só pode ser definida quando chamado "Worksheet.Protect" no código.

A básico, mas simples de entender resposta:

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

Como alternativa, você pode criar um escondida planilha , que iria realizar o valor alterado. A célula na planilha visível, protegida deve exibir o valor da folha de trabalho escondido usando uma fórmula simples.

Você será capaz de alterar o valor exibido pelo oculto planilha , enquanto que seus usuários não serão capazes de editá-lo.

Selecionei as células eu queria bloqueados em sheet1 e colocar o código sugerido na função open_workbook () e funcionou como um encanto.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top