Proteger celdas en Excel pero permitir que se modifiquen mediante un script VBA
Pregunta
Estoy usando Excel, donde se permiten ciertos campos para la entrada del usuario y otras celdas deben protegerse.He utilizado la hoja Tools Protect, 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 y, al mismo tiempo, permitir que el código VBA cambie los valores de las celdas en función de ciertos cálculos.
Solución
Intenta usar
Worksheet.Protect "Password", UserInterfaceOnly := True
Si el parámetro UserInterfaceOnly se establece en verdadero, el código VBA puede modificar las celdas protegidas.
Otros consejos
Puede modificar una hoja mediante código realizando 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
El debilidad Una de las ventajas 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 quedar en un estado desprotegido.
El código podría ser mejorado al tomar estas acciones
- Reproteger
- 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 'UserInterfaceOnly' establecido en verdadero.Esto permite que el código VBA modifique la hoja de trabajo, mientras la mantiene protegida de la entrada del usuario a través de la interfaz de usuario, incluso si se interrumpe la ejecución.
Esta configuración es perdido cuando el libro se cierra y se vuelve a abrir.La protección de la hoja de trabajo aún se mantiene.
Por lo tanto, el código de 'Reprotección' debe incluirse al inicio de cualquier procedimiento que intente modificar la hoja de trabajo o simplemente puede ejecutarse una vez cuando se abre el libro.
No creo que puedas configurar ninguna parte de la hoja para que sea editable solo por VBA., pero puedes hacer algo que tiene básicamente el mismo efecto: puedes desproteger la hoja de trabajo en VBA antes de necesitar 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 adelante, me equivoqué en la primera parte de mi respuesta, como Joe señala a continuación.Tú poder proteja una hoja para que sea editable solo con VBA, pero parece que la opción "UserInterfaceOnly" solo se puede configurar cuando se llama a "Worksheet.Protect" en el código.
Una respuesta básica pero sencilla de entender:
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
Como solución alternativa, puede crear un hoja de trabajo oculta, que mantendría el valor modificado.La celda de la hoja de trabajo visible y protegida debe mostrar el valor de la hoja de trabajo oculta mediante una fórmula simple.
Usted será capaz de cambiar el valor mostrado a través de la hoja de trabajo oculta, mientras que tus usuarios no podrán editarlo.
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ó a las mil maravillas.
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True