Validación de textbox en formulario de excel

Estoy luchando desde hace un rato con las validaciones de text box en un formulario de excel. A veces logro algunas cosas y otras no a pesar de que el código es el mismo. Creo que en realidad estoy errando con los eventos.

Paso a la descripción:

textbox1 = talla en cm

textbox2 = peso en kg

En un textbox3 calcula el indice de masa corporal después del evento after_update del textbox2

Hasta ahí todo bien.

Ahora quiero validar el textbox1 para que no este ni vacío (Si esta vacío advierto que no puede estar vacioy mantengo el foco en textbox1) ni sea menor a 100 ni mayor a 250, si fuese así aviso que esta fuera de rango, borro textbox1 y mantengo el foco en el mismo

Con textbox2 seria lo mismo pero el rango seria entre 50 y 400

El código lo pongo en el evento exit del textbox1

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1 = "" Then MsgBox "La talla no puede estar vacia"
Cancel = True
End Sub

Este funciona bien en cuanto a detectar que la celda esta vacía, pero al querer meter otro if con la condición no logro nada. Salvo errores. No puedo armar los if sin que me diga que hay else sin if lo cual no es así etc. Otro errore es que cuando he logrado algo casi que ande bien, si vuelvo a posicionarme en talla y peso no funcionan las condiciones o no saca el indice de masa corporal.

Ahora no tengo más código porque lo borre todo peros sigo intentando, puede tener que ver con los eventos que no los manejo bien.

1 respuesta

Respuesta
2

Te anexo el código para validar el peso y la talla.

La validación se realiza cuando sales del textbox.

El cálculo se realiza por cada número que capturas en los textbox.

Con el evento KeyPress se valida que solamente captures números; y después, se Calcula la Masa.

'VALIDACIONES DE TALLA
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    If Not (TextBox1 >= 100 And TextBox1 <= 250) Then
        MsgBox "La talla no está dentro del rango 100 a 250"
        Cancel = True
    End If
End Sub
'
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Por.Dante Amor
    If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
    Call Calcular_Masa
End Sub
'
'VALIDACIONES DE PESO
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    If Not (TextBox2 >= 50 And TextBox2 <= 400) Then
        MsgBox "La talla no está dentro del rango 50 a 400"
        Cancel = True
    End If
End Sub
'
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Por.Dante Amor
    If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
    Call Calcular_Masa
End Sub
'
Sub Calcular_Masa()
'Por.Dante Amor
    TextBox3 = 0
    If TextBox1 = "" Or TextBox1 = 0 Then Exit Sub
    If TextBox2 = "" Or TextBox2 = 0 Then Exit Sub
    '
    t1 = CDbl(TextBox1)
    t2 = CDbl(TextBox2)
    TextBox3 = t2 / (t1 * t1)
End Sub

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Hola. Primero que nada te agradezco muchísimo la respuesta.

El calculo de la masa etc ya lo tenia hechi y funciona.

No entendí bien como funciona el evento keypress.

Igual te comento que justo había logrado que funcione con un código similar al tuyo pero el problema que tengo ahora es que como lu puse en el evento exit del txt anda fenómeno, pero si quiero volver al form anterior con el botón atrás no me deja porque valida también. ¿Hay alguna forma de poner en la primera línea del evento exit que si se presiono ese botón salga de la rutina como para que no valide en ese caso?

Te copio como m había quedado a mi la de la talla, obviamente el peso lo hice igual

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If TextBox1 = "" Then
MsgBox "La talla no puede estar vacia"
Cancel = True
Else
If TextBox1 < 100 Or TextBox1 > 250 Then
MsgBox "Solo pueden ingresar pacientes con talla entre 200 y 250 cm"
TextBox1 = ""
Cancel = True

End If
End If

end sub

Otra cosa que nunca pude hacer es volver a poner el foco con textbox1.sefocus = true por eso uso el cancel que lo pone solo

Mil gracias

Así quedaría el código completo.

Al principio de todo el código, en Declaraciones, va la variable Saliendo.

Cada que quieras salir hay que poner la variable saliendo = True.

En este caso estoy poniendo la variable saliendo = true cuando cierras el formulario.

Y en los eventos Exit pregunto, si saliendo = true, entonces exit sub.

Public saliendo
'
'VALIDACIONES DE TALLA
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    If saliendo Then Exit Sub
    If Not (TextBox1 >= 100 And TextBox1 <= 250) Then
        MsgBox "La talla no está dentro del rango 100 a 250"
        Cancel = True
    End If
End Sub
'
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Por.Dante Amor
    If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
    Call Calcular_Masa
End Sub
'
'VALIDACIONES DE PESO
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    If saliendo Then Exit Sub
    If Not (TextBox2 >= 50 And TextBox2 <= 400) Then
        MsgBox "La talla no está dentro del rango 50 a 400"
        Cancel = True
    End If
End Sub
'
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Por.Dante Amor
    If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
    Call Calcular_Masa
End Sub
'
Sub Calcular_Masa()
'Por.Dante Amor
    TextBox3 = 0
    If TextBox1 = "" Or TextBox1 = 0 Then Exit Sub
    If TextBox2 = "" Or TextBox2 = 0 Then Exit Sub
    '
    t1 = CDbl(TextBox1)
    t2 = CDbl(TextBox2)
    TextBox3 = t2 / (t1 * t1)
End Sub
'
Private Sub UserForm_Activate()
    saliendo = False
End Sub
'
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    saliendo = True
End Sub

El evento keypress es para verificar que solamente puedas insertar números en los textbox.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Gracias nuevamente, perdón pero no entiendo bien donde ponerlo el código. Como debería acomodar el que hice yo para que me deje volver atrás (no cierro el form sino que al apretar volver esconde el actual y muestra el anterior.

Codigo del text box  de TALLA

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1 = "" Then
MsgBox "La talla no puede estar vacia"
Cancel = True
Else
If TextBox1 < 100 Or TextBox1 > 250 Then
MsgBox "Solo pueden ingresar pacientes con talla entre 200 y 250 cm"
TextBox1 = ""
Cancel = True
End If
End If
End Sub

Codigo tex box del peso (textbox4 es donde se muestra el indice de masa corporal)

Private Sub TextBox2_AfterUpdate()
If TextBox1 > 100 And texbox1 < 250 Then
If TextBox2 > 50 And TextBox2 < 300 Then

Dim talla As Integer

Dim peso As Integer
Dim ibm As Integer
Dim texbox4 As Integer
talla = Val(TextBox1)
peso = Val(TextBox2)
talla = (talla / 100) ^ 2
ibm = peso / talla
TextBox4 = ibm

Else

End If
End If

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If TextBox2 = "" Then
MsgBox "El peso no puede estar vacio"
Cancel = True
Else
If TextBox2 < 50 Or TextBox2 > 300 Then
MsgBox "Solo pueden ingresar pacientes con peso entre 50 y 300 kg"
TextBox2 = ""
Cancel = True
Exit Sub
End If
End If
End Sub

Con estos dos códigos funciona perfecto el tema es que si accedo al formularios donde al empezar se coloca el foco en talla, si quiero volver atrás con el botón que oculta el formulario actual y muestra el anterior, se activa la validación del evento exit del texbox1 o 2 y no puedo salir si no pongo datos válidos.

Eso de la variable saliendo debe ser la solución pero no entiendo donde ponerla.

El tema de no permitir el ingreso de letras lo voy a estudiar para entenderlo aunque no es tan problemático porque si bien te deja meter letras al salir del textbox corre la validación y te dice que solo se acepta pacientes entre tal y tal altura o peso y lo borra y fuerza a volver a ingresar. Obviamente es más prolijo como vos lo hiciste seguro.

Perdón por la falta de entendimiento pero recién comienzo y soy medico ! jajaja

Gracias abrazos

Te faltó poner el código que tienes en esto: "si quiero volver atrás con el botón que oculta el formulario actual y muestra el anterior"

Perdón era tan sencillo que no pensé que era importante.

Private Sub CommandButton3_Click()


userform_TP_a.Hide
userform_laboratorio.Show

End Sub

Abrazos

¿Y cuál es la condición para poder regresar?

¿Si ambos textbox1 y 2 están debidamente llenos puede regresar?

Si falta alguno de los 2, ¿no debe regresar?

Si los 2 están vacíos, ¿puede regresar?

Tienes que poner cada uno de los casos y te ayudo con el código.

Gracias

Con cualquiera de los dos que este vacío, en realidad las únicas dos opciones serian los dos vacíos o vacío el segundo (peso ) y lleno el de la talle, en esas situaciones ya no puedo volver ni avanzar (avanzar esta bien que no permita el tema es volver).

Obviamente si están los 2 llenos con los números en los intervalos que corresponde si me deja volver y avanzar.

Gracias

No entendí. Podrías simplificar, ¿en cuáles casos si podrías regresar y en cuáles caso no podrías regresar?

Si están ambos vacíos no puedo regresar, me dice talla no puede estar vacía

Si llene talla con un numero entre 100 y 250 y el peso vacío no puedo regresar dice el peso no puede estar vacío

Si están los dos llenos (obviamente que tienen los números que corresponde ya que valida al salir del text) puedo regresar, ya que al hacer la validación los camopos no están vacíos y los números son los adecuados

Otra situación si por algún motivo pase los dos y seguí con el formularios, si vuelvo por ejemplo al peso no lo puedo borrar ya que si lo dejo vacío no me deja volver.

En realidad necesito que saltee el exit cuando quiero volver atras y si cierro el form

Se me ocurrió una forma aunque no la pude probar y tampoco se si me va a salir. Te la comento a ver que te parece.

Armo un modulo ej form3, adentro dos sub una validaciontalla con el código que te pase y otra validacionpéso con el otro código.

En el evento keypress de talla pongo que si keypress es igual a la tecla tab o enter (las situaciones más comunes para salir de un textbox) llame a validaciontalla . En el evento click de peso hago lo mismo por si se quiere pasar con el mouse a ese text box.

En el keypress de peso hago lo mismo pero llamando a validación de peso. Y en cualquier otro evento que requiera que los campos estén debidamente completo llamo a los dos. Creo que lógicamente debería funcionar ya que el problema es que valida siempre al salir del textbox de esta forma solo validaría cuando yo quiero.

¿Qué te parece?

Abrazos

Esta es tu pregunta original:

"Ahora quiero validar el textbox1 para que no este ni vacío (Si esta vacío advierto que no puede estar vacioy mantengo el foco en textbox1) ni sea menor a 100 ni mayor a 250, si fuese así aviso que esta fuera de rango, borro textbox1 y mantengo el foco en el mismo"

Mi respuesta responde a tu requerimiento; y además te entregué un adicional, para verificar que solamente capture números, de esa forma no tendrás problemas para hacer cálculos:

'VALIDACIONES DE TALLA
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Por.Dante Amor
    If Not (TextBox1 >= 100 And TextBox1 <= 250) Then
        MsgBox "La talla no está dentro del rango 100 a 250"
        Cancel = True
    End If
End Sub
'
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Por.Dante Amor
    If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
    Call Calcular_Masa
End Sub

Es difícil imaginar todo el ambiente que tienes en tu formulario, como eso de que tienes un botón para regresar al formulario anterior, si lo hubieras comentado desde un principio, tal vez, te hubiera entregado una respuesta a esa necesidad. Pero yo no lo sabía, así que mi respuesta funciona para lo que solicitaste.

Así es funciona al igual que la mía, el tema es que al estar en el evento exit una vez puesto el foco en ese text box no podes salir de ninguna forma ya que te piede que lo llenes si o si, ya sea volvien al formulario anterior o cualquier otra cosa, por lo que debería intentar evitar el evento exit y hacerlo con otro, por eso se me ocurrió lo de las subrutinas y los eventos keypress.

Gracias

Perdón cuando fui a votar decía votada como negativa pero yo nunca vote eso, ya lo cambie. Mil disculpas se me debe haber presionado y no me había dado cuenta.

Abrazos

Seguiré probando con el tema de las subrutinas y el keypress a ver si sale así

Abrazos

Como no sabía lo de tu botón para regresar, te propuse la variable "saliendo", con esa variable puedes salir y no te detiene, es decir, si saliendo = true, entonces no te obliga a poner un dato en talla ni en peso. Ahí en mi código está la respuesta.


Pero te explico lo que sucede, si el foco está en el textbox "Peso", y presionas el botón "Regresar", no estás presionando "Regresar" como primer evento, el primer evento que se ejecuta es "Exit" del textbox "Peso", digamos que estás abandonando el textbox para ir a presionar el botón; entonces, como estás saliendo, el primer evento es "exit".

Lo recomendable en estos casos es validar con el botón.

Quita los eventos de exit y traslada el código de validación de peso y talla al mismo botón de "regresar". Conserva mi código de keypress para validar que solamente capturen números.

Ahora dentro del código del botón, validas que los campos estén llenos, que los campos tengan los rangos permitidos y si todo está bien, entonces regresas al formulario anterior. Si hay algún error, envías tu aviso y permaneces en el formulario.

Para salir de la captura sin validar, creas otro botón: "Cancelar", en ese botón puedes poner una pregunta "Seguro que desea cancelar", entonces si presiona "Sí" regresas al formulario anterior, si presiona "No" permaneces en el formulario.

Sal u dos

Si tal cual, en realidad la validación la tendría que poner en siguiente no en regresar, ya que si valida al regresar pasaría lo mismo y no tiene mucho sentido ya que los valores se van a tener en cuenta solo al continuar la carga con el siguiente formulario. Esa forma la tenia y es más practica pero me gusto la idea de validar por pasos.

Gracias

Hola te hago otra consulta, tienes idea porque el código para entrar solo números funciona solo si lo coloco en el evento keypress y no desde una subrutina.

Me explico. Hago un moudo y dentro de el

public solonumeros()

Public solonumeros()
If Not (KeyAscii >= 48 And KeyAscii <= 57) And KeyAscii <> 46 Then
        KeyAscii = 0
    End If
end sub

y en el evento porngo 

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 call solonumeros
End Sub

la rutina la llama bien porque para probar si estaba llendo a solo numeros pus un msgbox despues del keyascii = 0 y lo muestra.

Obviamente después lo saque para que no detenga la rutina y nada deja ingresar cualquier cosa, ahora si el código lo pongo en el evento keypress lo hace bien. No entiendo debería funciona

Gracias

No funciona la rutina solonumeros() porque el valor keyascii está en el formulario. Tendrías que hacer una función, tienes que enviar un parámetro y esperar un resultado, en el evento tendrías que verificar el resultado y decidir qué hacer, lo cual veo más engorroso. En el keypress tienes solamente 3 líneas de código, si creas una función, tendrías 3 líneas de código en la función y 4 líneas más en el evento, no veo necesario crear una función menos una rutina, entre más rutinas, es más complicado darle seguimiento al código. Pero tú decides cuánto más código crear y cuantas rutinas crear.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas