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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top