Activar o desactivar campos según valor

Ando loco con esta función que no sé porque no me funciona.

Es un formulario llamado BS_CHEQUEO_COLECTIVOS en el cual dependiendo del valor que le de al campo COLECTIVO se deben activar unos campos y otros no. La función como podréis ver es muy simple con el If le digo que todos los que están como False los inactive y el resto al no ponerles nada entiendo que los deja activo. La primera parte funciona perfectamente pero a partir del Else para el Colectivo 2 ya no me funciona bien. ¿Puede ser que el If no permite tantas opciones? Tengo entendido que el Select Case es mejor para estos casos pero no sé como se debe escribir la función.

De nuevo muchas gracias.

Private Sub Form_Current()

If Me.COLECTIVO = 1 Then
Me.FM25_1.Enabled = False
Me.FM25_2.Enabled = False
Me.FM25_3.Enabled = False
Me.FM25_4.Enabled = False
Me.FM25_5.Enabled = False
Me.FM25_6.Enabled = False
Me.FM25_7.Enabled = False
Me.FM25_8.Enabled = False
Me.FM25_9.Enabled = False
Me.EDR_1.Enabled = False
Me.EDR_2.Enabled = False
Me.EDR_3.Enabled = False
Me.DAUT_1.Enabled = False
Me.DAUT_2.Enabled = False
Me.CE_1.Enabled = False
Me.CE_2.Enabled = False
Me.CE_3.Enabled = False
Me.PM_1.Enabled = False
Me.PM_2.Enabled = False
Me.PM_3.Enabled = False
Me.CCE_1.Enabled = False
Me.TFN_1.Enabled = False
Me.TFN_2.Enabled = False
Me.TFN_3.Enabled = False
Me.FM40_1.Enabled = False
Me.FM40_2.Enabled = False
Me.FM40_3.Enabled = False
Me.FM40_4.Enabled = False
Me.FM40_5.Enabled = False
Me.FM40_6.Enabled = False
Me.FM40_7.Enabled = False
Me.FM40_8.Enabled = False
Me.FM40_9.Enabled = False

Else
If Me.COLECTIVO = 2 Then
Me.FM25_1.Enabled = False
Me.FM25_2.Enabled = False
Me.FM25_3.Enabled = False
Me.FM25_4.Enabled = False
Me.FM25_5.Enabled = False
Me.FM25_6.Enabled = False
Me.FM25_7.Enabled = False
Me.FM25_8.Enabled = False
Me.FM25_9.Enabled = False
Me.EDR_1.Enabled = False
Me.EDR_2.Enabled = False
Me.EDR_3.Enabled = False
Me.DAUT_1.Enabled = False
Me.DAUT_2.Enabled = False
Me.CE_1.Enabled = False
Me.CE_2.Enabled = False
Me.CE_3.Enabled = False
Me.SCE_1.Enabled = False
Me.SCE_2.Enabled = False
Me.CCE_1.Enabled = False
Me.TFN_1.Enabled = False
Me.TFN_2.Enabled = False
Me.TFN_3.Enabled = False
Me.FM40_1.Enabled = False
Me.FM40_2.Enabled = False
Me.FM40_3.Enabled = False
Me.FM40_4.Enabled = False
Me.FM40_5.Enabled = False
Me.FM40_6.Enabled = False
Me.FM40_7.Enabled = False
Me.FM40_8.Enabled = False
Me.FM40_9.Enabled = False

End If
End If

End Sub

2 respuestas

Respuesta
2

Javier, cuando vas a encadenar dos o más opciones debes usar Elseif. En tu caso

If colectivo.=1 then

....

else

...

end if( uno sólo, aunque tu has puesto, al menos en la pregunta, 2)

Eso querría decir. Si colectivo = 1 entonces haz....

Si colectivo es distinto de 1, o sea, 2, 3, 4 ...el que sea, entonces...

Para el caso de que colectivo pueda coger varios valores te convendría usar

If colectivo=1 then

....

elseif colectivo=2 then

....

elseif colectivo=3 then

....

end if

Respuesta
1

Esta mal la estructura de los IF, debe ser:

If Me.COLECTIVO = 1 Then

...

Else

ENDIF 

Sobra IF Me.COLECTIVO = 2 THEN,  toda vez, que sino se cumple la primera condición se ejecuta lo que esté después del Else

¡Gracias! El problema es que he cortado el código para no hacerlo demasiado largo, tengo hasta siete colectivos por lo que lógicamente cada uno de ellos lleva unas condiciones diferentes.

Algo más abreviado:

Private Sub Form_Current()

Dim ctl As Control

If Me.COLECTIVO = 1 Then

For Each ctl In Controls
With ctl
If .Name Like "FM*" Or _
.Name Like "ED*" Or _
.Name Like "DA*" Or _
.Name Like "CE*" Or _
.Name Like "CC*" Or _
.Name Like "TF*" Then
.Visible = False
End If
End With

Next ctl

Else

For Each ctl In Controls
With ctl
If .Name Like "FM*" Or _
.Name Like "ED*" Or _
.Name Like "DA*" Or _
.Name Like "CE*" Or _
.Name Like "CC*" Or _
.Name Like "TF*" Then
.Visible =True

End If
End With

Next ctl

End if

En ese caso utilice SELECT CASE

Disculpa mi torpeza pero es que no termino de entender el código. Después del Else ¿No debería identificar el colectivo? Te lo comento porque tal como te comenté más adelante tengo hasta siete colectivos distintos. Gracias por tu paciencia.

If Me.COLECTIVO = 1 Then
Me.FM40_1.Enabled = False
Me.FM40_2.Enabled = False
Me.FM40_3.Enabled = False

Else
If Me.COLECTIVO = 2 Then
Me.FM25_1.Enabled = False
Me.FM25_2.Enabled = False
Me.FM25_3.Enabled = False
Me.FM25_4.Enabled = False

Else
If Me.COLECTIVO = 3 Then
Me.DE_1.Enabled = False
Me.DE_2.Enabled = False
Me.DE_3.Enabled = False
Me.DE_4.Enabled = False

Else
If Me.COLECTIVO = 4 Then
Me.DNI_1.Enabled = False
Me.DNI_2.Enabled = False
Me.DNI_3.Enabled = False
Me.DNI_4.Enabled = False

Else
If Me.COLECTIVO = 5 Then
Me.BO_1.Enabled = False
Me.BO_2.Enabled = False
Me.BO_3.Enabled = False
Me.BO_4.Enabled = False

Else
If Me.COLECTIVO = 6 Then
Me.AO_1.Enabled = False
Me.AO_2.Enabled = False
Me.AO_3.Enabled = False
Me.AO_4.Enabled = False

Else
If Me.COLECTIVO = 7 Then
Me.BC_1.Enabled = False
Me.BC_2.Enabled = False
Me.BC_3.Enabled = False
Me.BC_4.Enabled = False


End If
End If
End If
End If
End If
End If
End If
End Sub

No entiendo para que tantos COLECTIVOS como lo tenía inicialmente estaba bien y abreviando con FOR EACH como le expliqué, veo que sigue utilizando mal el ELSE. En el último código que muestra ¿Cómo activa nuevamente los controles?. Ingrese unos datos ficticios y envíeme la base de datos a [email protected]

Enviada por wetransfer. muchas gracias

Ya le envíe a su correo la base datos, le recomiendo no utilizar varios if elseif end if como le indican, cuando hay más de 2 es un mal hábito de programación, en su defecto se utiliza la sentencia:

Select Case valor

  Case 1

  Case 2

  Case 3

  Case 4

End Select

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas