Proteger campos de forma masiva mediante VBA, y da error si se intenta escribir o hacer clic

Estoy intentando desarrollar un código que me permita bloquear los campos de texto, los checkboxes y los combo, si un checkbox está activo o no (ver la imagen a continuación), sin tener que hacerlo uno a uno para cada uno de los controles, y que me de un mensaje de error si se intenta hacer clic o escribir sobre esos controles.

Estoy probando con este código:

Public Function BloquearCampos(FName As Form)
   Dim ctl As Control
   For Each ctl In FName.Controls
        Select Case ctl.ControlType
           Case "acCheckBox", "acComboBox", "acTextBox"
                If FName.ChkBloquear = -1 Then
                    Screen.ActiveControl.Locked
                End If
        End Select
   Next ctl
   Set ctl = Nothing
End Function

Sigue...

2 respuestas

Respuesta
2

No te funciona porque screen. Activecontrol solo actúa en el control que tiene el foco en el formulario, y el bucle for each ctl que tienes, por si solo no cambia el foco a los distintos controles.

Soluciones hay dos, o ir pasando el foco con setfocus a cada control para que puedas usar el screen. Activecontrol, o bien usar directamente el control cargado en la variable ctl para bloquearlo.

El error ya me he dado cuenta hace un rato.

Mi problema es que no sé cómo pasar el setfocus, o usar directamente el control cargado en la variable ctl para bloquearlo. Vamos, la sintaxis. Si me pudieras poner un ejemplo, lo pruebo.

¡Gracias!

Te escribo desde el móvil, sin probarlo primero, pero alguna de estas te tendría que funcionar :

Ctl. Setfocus

FName. Controls(ctl. Name). Setfocus

Para el locked, igual.

Estoy probando con esto:

Public Function BloquearCampos(FName As Form)
   Dim ctl As Control
    If FName.ChkBloquear = -1 Then
       For Each ctl In FName.Controls
            Select Case ctl.ControlType
               Case "acCheckBox", "acComboBox", "acTextBox"
                        ctl.SetFocus
                        Screen.ActiveControl.Locked
            End Select
       Next ctl
       Set ctl = Nothing
    End If
End Function

Y tampoco.

Lo otro que se me ocurre sería poner ctl.Locked, pero tampoco funciona.

Intenta la opción con controls(), esa seguro que te funciona

A ver, he probado esto:

Public Function BloquearCampos(FName As Form)
   Dim ctl As Control
    If FName.ChkBloquear = -1 Then
       For Each ctl In FName.Controls
            Select Case ctl.ControlType
               Case "acCheckBox", "acComboBox", "acTextBox"
                        FName.Controls(ctl.Name).SetFocus
                        Screen.ActiveControl.Locked
            End Select
       Next ctl
       Set ctl = Nothing
    End If
End Function

Y esto:

Public Function BloquearCampos(FName As Form)
   Dim ctl As Control
    If FName.ChkBloquear = -1 Then
       For Each ctl In FName.Controls
            Select Case ctl.ControlType
               Case "acCheckBox", "acComboBox", "acTextBox"
                        FName.Controls(ctl.Name).Locked
            End Select
       Next ctl
       Set ctl = Nothing
    End If
End Function

Y ninguna da resultado.

Cuando puedas, no tiene que ser ahora mismo. ¡Mil gracias! Pero es que no consigo hacer funcionar. Un saludo.

Quita las comillas a los valores del Case.... XD

Me dice que el objeto no admite esta propiedad o método, y me indica esta línea:

FName.Controls(ctl.Name).Locked

¡Gracias!

Estoy haciendo pruebas. FName.Controls(ctl.Name) me da el valor del campo, pero no el nombre del campo. Lo que sí me da el nombre del campo es ctl.Name, pero ¿cómo le digo que lo proteja? Me da error si pongo ctl.Name.Locked.

¡Gracias!

Es normal que te de error, porque no le estás asignando ningún valor a la propiedad Locked (o es true o es false), pero se lo has de indicar con un =

Yo hice la prueba ya al mediodía y funciona perfectamente

Respuesta
1
Public Function MensajeDeCampoBloqueadoAlPresionarUnaTecla(FName As Form)
   Dim ctl As Control
   For Each ctl In FName.Controls
        Select Case ctl.ControlType
           Case "acCheckBox", "acComboBox", "acTextBox"
                If Screen.ActiveControl.Locked Then
                    MsgBox " Este campo está bloqueado", vbInformation, "WebPc"
                End If
        End Select
   Next ctl
   Set ctl = Nothing
End Function

Y en el formulario en cuestión, de esta manera:

Private Sub Form_AfterUpdate()
    Call BloquearCampos(Me)
End Sub
Private Sub Form_Current()
    Call BloquearCampos(Me)
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
    Call MensajeDeCampoBloqueadoAlPresionarUnaTecla(Me)
End Sub

Pero no me funciona. ¿Sabéis qué puedo estar haciendo mal?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas