No se ejecuta instrucción al seleccionar una opción en formulario (Select Case)

Tengo en un formulario insertado un grupo de opciones (Marco5) una opción llamada Orden2006 y otra opción llamada Orden2020.

En el mismo formulario tengo insertado tres textbox llamados Prueba, PCorregida y Texto16 (donde realizo un cálculo). Lo que pretendo es que al seleccionar una opción u otra me haga lo que tengo en la siguiente instrucción, la cual la tengo insertada en Al hacer clic:

Private Sub Marco5_Click()

Select Case Me.Marco5

 Case 1 'Orden 2006

 Prueba.SetFocus

If Prueba.value >= 0.15 And Prueba.value <= 0.4 Then

 PCorregida.SetFocus

 PCorregida.value = Left(Prueba.value - 0.03, 4)

ElseIf Prueba.value >= 0.41 And Prueba <= 1 Then

 PCorregida.SetFocus

 PCorregida.value = Left(Prueba * 0.925, 4)

ElseIf Prueba.value >= 1.01 And Prueba <= 2 Then

 PCorregida.SetFocus

 Texto16.value = (Prueba * 20 / 100)

 PCorregida.value = (Prueba - Texto16)

ElseIf Prueba.value >= 2 And Prueba <= 2.455 Then

 PCorregida.SetFocus

 Texto16.value = (Prueba * 20 / 100)

 PCorregida.value = (Prueba - Texto16)

ElseIf Prueba.value >= 2.455 Then

 Texto16.value = (Prueba * 0.75) - 1.35

 PCorregida.value = (Prueba - Texto16)

End If

 Case 2 'Orden 2020

 Prueba.SetFocus

If Prueba.value >= 0.15 And Prueba <= 0.4 Then

 PCorregida.value = Left(Prueba - 0.03, 4)

ElseIf Prueba.value >= 0.41 And Prueba <= 1 Then

 PCorregida.SetFocus

 PCorregida.value = Left(Prueba * 0.925, 4)

ElseIf Prueba.value >= 1.01 And Prueba <= 2 Then

 PCorregida.value = Left(0.75 * 0.925, 4)

ElseIf Prueba.value > 2 And Prueba > 2.455 Then

 PCorregida.SetFocus

 Texto16.value = (Prueba * 0.75) - 1.35

 PCorregida.value = (Prueba - Texto16)

End If

 End Select

End Sub

Por ejemplo si selecciono Case1:

He inserto en Prueba=0,15 en PCorregida debería salir 0,12, y no sale el resultado, sale 0,00. Me podéis decir donde pudiera estar cometiendo el error o si por el contrario debería hacer otro planteamiento.

2 Respuestas

Respuesta
1

Le recomiendo que a los campos los configure en propiedades Formato, Estándar.

Pruebe con este código:

  If Me.Prueba.Value >= 0.15 And Me.Prueba.Value <= 0.4 Then
    Me.PCorregida = left(Me.Prueba.Value - 0.03, 4)
  End If

Antonio permítame decirle que no necesita utilizar ROUND() en absoluto, solo configure las propiedades de los campos como Estándar y 4 decimales. Ahora, para que un SELECT CASE cuando solo hay 2 opciones, esto se hace cuando son más de 2 o 3 opciones, igualmente para que utilizar tantos IF - ELSEIF, en este caso es mejor la sentencia SELECT CASE. Observe las imágenes

Ahora observe esta imagen en donde obtengo el mismo resultado del ejemplo que le dan.

CÓDIGO DEL EVENTO AL HACER CLIC EN EL MARCO DE OPCIONES

Private Sub Marco5_Click()
  If Me.Marco5 = 1 Then
    Select Case Prueba
       Case 0.15 To 0.4
         Me.pCorregida = Prueba - 0.03
       Case 0.41 To 1
         Me.pCorregida = Prueba * 0.925
       Case 1.01 To 2.455
         Me.pCorregida = Prueba * (1 - 20 / 100)
       Case Is > 2.455
         Me.pCorregida = Prueba * (1 - 0.75) - 1.35
    End Select
  Else
    Select Case Prueba
      Case 0.15 To 0.4
        Me.pCorregida = Prueba - 0.03
      Case 0.41 To 1
        Me.pCorregida = Prueba * 0.925
      Case 1.01 To 2
        Me.pCorregida = 0.75 * 0.925
      Case 2.01 To 2.455
        Me.pCorregida = Prueba(1 - 0.75) - 1.35
    End Select
  End If
End Sub

Como puede apreciar es un código más legible.

Hola  Eduardo y gracias por contestar, algo debo de estar haciendo mal, pues sigo tus instrucciones (gracias por el nuevo código) y cuando selecciono por ejemplo 2006 voy al cuadro de prueba inserto el número por ejemplo 0,15 pulso Enter y no sale el resultado en la otra casilla, en cambio sí voy al marco nuevamente y selecciono 2020, me sale el resultado en la casilla PCorregida.

Claro disculpe se me olvide incluir el código del evento Después de actualizar del campo Prueba. Ahora no estoy cerca al pc. Más tarde se lo envío.

Este es el código del evento Después de actualizar del campo Prueba

Private Sub Prueba_AfterUpdate()
  If Not IsNull(Me.Marco5) Then
     Call Marco5_Click
  End If
End Sub
Respuesta
1

Antonio, permíteme unas consideraciones

1º. Por lo que dices entiendo que los valores que parecen números son efectivamente números. Entonces, ¿para qué usar Left cuando tienes la instrucción Round(redondea)

2ºPor la instrucción que pones parece que los valores ya están escritos en el control Prueba y que sólo decides si activas la casilla Orden 2006 o la Orden 2020. Si es así, no necesitas enviar el foco a el control Prueba ni al Prueba Corregida

3º Si te fijas tanto en la instrucción

If prueba>=1,01.....

y en la instrucción

If prueba >=2.01...

la operación es la misma. Por tanto, para que repetirla.

4º. Si te fías de las matemáticas( y los ordenadores no se equivocan) te sobra el cuadro de texto Texto16

Por ejemplo, si tengo el formulario( te pongo el texto 16 para que veas que no interviene)

Si selecciono Orden 2006

Con otros números

Y selecciono la misma Orden, ya que no quise trabajar más.

En este caso, el código del evento Después de actualizar del marco de opciones, sólo para Orden 2006, la de 2020 es igual y te la dejo para tí, es

Private Sub Marco5_AfterUpdate()
Select Case Marco5
Case Is = 1
If Prueba >= 0.15 And Prueba <= 0.4 Then
PruebaCorregida = Round(Prueba - 0.03, 4)
ElseIf Prueba >= 0.41 And Prueba <= 1 Then
PruebaCorregida = Round(Prueba * 0.925, 4)
ElseIf Prueba >= 1.01 And Prueba <= 2.455 Then
PruebaCorregida = Prueba * (1 - 20 / 100)
Else
PruebaCorregida = Prueba - ((Prueba * 0.75) - 1.35)
End If
End Select
End Sub

Gracias Julián por tu aclaración y respuesta, comentarte que lo que primero quiero realizar es seleccionar la orden y a continuación introducir el número y que me de el resultado. No como lo planteas que es introducir el número y luego seleccionar la orden. Como debería de plantearlo.

Entonces puedes poner la instrucción en el evento Después de actualizar del cuadro de texto Prueba

La respuesta más desafortunada es la del que te aconsejó mantener el Left

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas