tabla - Proteger celdas en Excel pero permitir que estas sean modificadas por el script VBA
como proteger un grupo de celdas en excel (6)
Estoy usando Excel donde ciertos campos están permitidos para la entrada del usuario y otras células deben ser protegidas. He utilizado la hoja Herramientas Protegidas, sin embargo, después de hacer esto, no puedo cambiar los valores en el script VBA. Necesito restringir la hoja para detener la entrada del usuario, al mismo tiempo permitir que el código VBA cambie los valores de la celda en función de ciertos cálculos.
Como solución alternativa, puede crear una hoja de cálculo oculta , que contendrá el valor modificado. La celda de la hoja de cálculo protegida visible debe mostrar el valor de la hoja de trabajo oculta con una fórmula simple.
Podrá cambiar el valor mostrado a través de la hoja de trabajo oculta , mientras que sus usuarios no podrán editarlo.
Intenta usar
Worksheet.Protect "Password", UserInterfaceOnly := True
Si el parámetro UserInterfaceOnly se establece en verdadero, el código de VBA puede modificar las celdas protegidas.
Puedes modificar una hoja a través del código tomando estas acciones
- Desproteger
- Modificar
- Proteger
En código esto sería:
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 debilidad de este método es que si el código se interrumpe y el manejo de errores no lo captura, la hoja de trabajo podría dejarse en un estado desprotegido.
El código podría mejorarse tomando estas acciones
- Re-proteger
- Modificar
El código para hacer esto sería:
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 renueva la protección en la hoja de trabajo, pero con el ''UserInterfaceOnly'' establecido en verdadero. Esto permite que el código de VBA modifique la hoja de trabajo, manteniendo la hoja de trabajo protegida de la entrada del usuario a través de la interfaz de usuario, incluso si la ejecución se interrumpe.
Esta configuración se pierde cuando el libro de trabajo se cierra y se vuelve a abrir. La protección de la hoja de cálculo todavía se mantiene.
Por lo tanto, el código de ''Reprotección'' debe incluirse al comienzo de cualquier procedimiento que intente modificar la hoja de trabajo o solo puede ejecutarse una vez cuando se abre el libro de trabajo.
Seleccioné las celdas que quería bloquear en la hoja 1 y coloqué el código sugerido en la función open_workbook () y funcionó como un amuleto.
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Una respuesta básica pero fácil de entender:
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
No creo que pueda configurar ninguna parte de la hoja para que sea editable solo por VBA , pero puede hacer algo que tenga básicamente el mismo efecto: puede desproteger la hoja de trabajo en VBA antes de que necesite realizar cambios:
wksht.Unprotect()
y vuelva a protegerlo cuando haya terminado:
wksht.Protect()
Editar: parece que esta solución puede haber resuelto el problema inmediato de Dheer, pero para cualquiera que se encuentre con esta pregunta / respuesta más tarde, me equivoqué con la primera parte de mi respuesta, como Joe señala a continuación. Puede proteger una hoja para que sea editable solo mediante VBA, pero parece que la opción "UserInterfaceOnly" solo se puede establecer cuando se llama a "Worksheet.Protect" en el código.