Private Sub txtIdentificacion_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
If KeyAscii = 13 Then
If txtIdentificacion.Text <> "" Then
ValidaDocumento txtIdentificacion.Text
Else
MsgBox "Debe ingresar el codigo"
End If
End If
End Sub
> ... he intentado aplicar el siguiente codigo para el evento KeyPress en un formulario
> aplicandolo a la tecla enter, cuando lo ejecuto y presiono esta tecla simplemente va a siguiente textbox
> la verdad no sé que estoy haciendo mal pues tengo entendido que el KeyAscii correspondiente es el 13...
1) el codigo que expones [segun se aprecia] esta 'trabajando bien' -???- [simplemente]
a) 'detecta' si la tecla que se ha pulsado es la tecla {enter} con el -> If KeyAscii = 13 Then
b) [despues de pulsar enter] 'verifica' si el control NO se ha dejado 'vacio' con el -> If txtIdentificacion.Text <> "" Then
c) despues de NO vacio, manda a ejecutarse otro procedimiento con el -> ValidaDocumento txtIdentificacion.Text
d) si el control de texto esta vacio... manda un cuadro de mensajes con el -> MsgBox "Debe ingresar el codigo"
e) si la tecla pulsada NO es {enter}... simplemente... no hace nada :))
-> en ningun momento le estas indicando al codigo que si el control esta vacio no debe permitir al usuario cambiar de control :-(
2) si esto ultimo es tu intencion... usa el evento '_exit' para cancelar/evitar/... la salida del control [p.e.]
Private Sub txtIdentificacion_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = Trim(txtIdentificacion) = ""
End Sub
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
__ el codigo expuesto __
Saludos
> ... sabes he probado y sigo con el mismo problema mi idea es la siguiente:
> que el usuario ingrese un numero de identificacion y que cuando presione enter
> este numero ingresado sea verificado por un procedimiento denominado ValidaDocumento
> el cual como resultado muestra un mensaje que indica si el número ingresado es válido o no
> ... No mas y la verdad no entiendo por que no funciona...
no me queda muy 'claro' si la que has 'probado' incluye la propuesta del punto 2 del mensaje anterior ?-
'dejame repetirte' la parte final de mi correo anterior [es probable que no lo hayas 'captado'] -?-
> ... acabo de poner un punto de inspección en: If txtIdentificacion.Text <> "" Then
> ... y jamás pasa por allí, es como si no reconociera a la tecla enter con el ascii 13 ...
el evento 'keypress' [generalmente] se usa para 'validar' las entradas 'imprimibles' [caracteres ascii]
para el efecto que necesitas de 'liberar' el enfoque al presionar enter...
______
Private Sub txtIdentificacion_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
If txtIdentificacion.Text <> "" Then
ValidaDocumento txtIdentificacion.Text
Else
MsgBox "Debe ingresar el codigo"
End If
End If
End Sub
nota: no se alcanza a 'ver' que es lo que hace el procedimiento ValidaDocumento -???-
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
> ... ValidaDocumento es un procedimiento que determina si el numero de identificacion
> ingresado en el textbox es valido... o no a traves de un mensaje
> ... hay un detalle que... solucionar.. cuando ingreso un numero... NO VALIDO
> ... indica a traves de un mensaje que no lo es, pero igual pierde el enfoque
> ... me gustaría que esto suceda solo si el numero de identificación SI ES VALIDO
> es decir que no se pueda salir del control mientras no se ingrese uno valido....
1) ya comprobaste que el evento '_exit' puede impedir que el usuario 'abandone' un control
-> mientras 'el control' tenga el foco
-> otra forma de 'devolver' el foco a un control que lo haya perdido es una instruccion del tipo: <objeto>.SetFocus
-> si tienes forma de identificar cual control se esta 'validando'... utiliza la instruccion con un 'SetFocus'
2) dado que el usuario puede cambiar de control NO 'necesariamente' hacia 'el siguiente' [en un orden pre-supuesto]
y como no es 'claro' si el procedimiento 'ValidaDocumento' lo mantienes separado para usarlo con varios controles...
-> si NO tienes forma de identificar el control... necesitaras 'mover' las instrucciones de validacion al evento '_exit'
Private Sub txtIdentificacion_KeyDown(ByVal KeyCode As
MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
If txtIdentificacion.Text <> "" Then
ValidaDocumento txtIdentificacion.Text
Else
MsgBox "Debe ingresar el ID"
End If
End If
End Sub
Private Sub txtIdentificacion_Exit(ByVal Cancel As
MSForms.ReturnBoolean)
Cancel = Trim(txtIdentificacion) = ""
End Sub
El código de ValidaDocumento es bastante extenso pero suponiendo que
sea el siguiente:
Sub ValidaDocumento(Pcedula As String)
If Len(Trim(Pcedula)) >= 10 Then
msgbox "ID Válido"
textbox1.SetFocus 'pasa al siguiente TextBox
else
msgbox "ID no válido"
txtIdentificacion.SetFocus 'No cambia el foco
End if
End Sub
Funciona bien en el sentido que no me permite salir de
txtIdentificación mientras no ingrese un número, pero si el número
ingresado es válido o no igual pasa al siguiente textbox (TextBox1).
Mi intención es que el usuario:
1. No pueda salir del TextBox mientras no ingrese un número.
2. No pueda salir del TextBox mientras el número ingresado no pase la
prueba de ValidaDocumento, para nuestro supuesto que la longitud de la
cadena sea mayor o igual a 10. O mejor dicho que no pueda hacer NADA
si el ID ingresado en txtIdentificacion no es Válido.
Muchas Gracias por tú valiosa ayuda!!
1) si es necesario un [sub] procedimiento para 'validar' que la entrada de un textbox sea 'valida'...
supongo que podrian ser tambien diferentes las condiciones para validar uno u otro textbox segun... ???
2) lo 'intrigante' pudiera ser si vas a 'forzar' un avance al 'textbox1' como 'siguiente'... [siempre ???]
de lo contrario... como puedes estar seguro de a cual control tiene intenciones de cambiarse el usuario ?
3) prueba a evitar la salida del control uniendo las condiciones [para el caso especifico de este ejemplo] con algo como:
Private Sub txtIdentificacion_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = Trim(txtIdentificacion) = "" Or Len(Trim(txtIdentificacion)) < 10
If Cancel Then MsgBox "Entrada no valida !!!"
End Sub
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
__ la consulta original __
> ... he usado el siguiente codigo:
> Private Sub txtIdentificacion_KeyDown(ByVal KeyCode As
> MSForms.ReturnInteger, ByVal Shift As Integer)
> If KeyCode = vbKeyReturn Then
> If txtIdentificacion.Text <> "" Then
> ValidaDocumento txtIdentificacion.Text
> Else
> MsgBox "Debe ingresar el ID"
> End If
> End If
> End Sub
>
> Private Sub txtIdentificacion_Exit(ByVal Cancel As MSForms.ReturnBoolean)
> Cancel = Trim(txtIdentificacion) = ""
> End Sub
>
> El codigo de ValidaDocumento es bastante extenso pero suponiendo que sea el siguiente:
>
> Sub ValidaDocumento(Pcedula As String)
> If Len(Trim(Pcedula)) >= 10 Then
> msgbox "ID Válido"
> textbox1.SetFocus 'pasa al siguiente TextBox
> else
> msgbox "ID no válido"
> txtIdentificacion.SetFocus 'No cambia el foco
> End if
> End Sub
> Funciona bien en el sentido que no me permite salir de txtIdentificacion mientras no ingrese un numero
> pero si el numero ingresado es valido o no igual pasa al siguiente textbox (TextBox1). Mi intencion es que el usuario:
> 1. No pueda salir del TextBox mientras no ingrese un numero.
> 2. No pueda salir del TextBox mientras el numero ingresado no pase la prueba de ValidaDocumento
> para nuestro supuesto que la longitud de la cadena sea mayor o igual a 10.
> O mejor dicho que no pueda hacer NADA si el ID ingresado en txtIdentificacion no es Valido.