Evento exit o otro, no me soluciona el SetFocus

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If MINCaracter(txtCod, "Cod/Producto", 10) = False Then Exit Sub ''AQUI 10 DIGITOS Max
    txtCod.SetFocus
End Sub
Private Sub txtCod_AfterUpdate()
End Sub

Hola Ariel, de nuevo con este embrollo. Pruebo 1 o 2  eventos y ninguno me devuelve el focus al txtCod

Después de Aceptar el mensaje, en cualquier evento apropiado para el fin, siempre me pasa el focus al siguiente Box

¿Será qué puedes hacer algo? Diciéndome alguna posible solución, (¿si la hay)?

2 Respuestas

Respuesta
1

Ahí tienes la propuesta de Dante

Haber que tal así

Function MINCaracter(wtext As MSForms.Control, cantidad)
    If Not (Len(wtext) = cantidad) Then
        MsgBox "El " & Texto & " no contiene la cantidad de dígitos necesarios", 64, ""
        wtext.SetFocus
        MINCaracter = False
    Else
        MINCaracter = True
    End If
End Function

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If MINCaracter(txtCod, 10) = False Then Cancel = True
End Sub

Buen día Dante

Function MINCaracter(wtext As MSForms.Control, Texto, cantidad)
'Por.Dante Amor 'Valida contenido de un textbox
    If Len(wtext) <> cantidad Then
        MsgBox "El " & Texto & " no contiene la cantidad de dígitos necesarios", 64, ""
        wtext.SetFocus 'deberia quedar el focu en el txtCod
        MINCaracter = False
    Else
        MINCaracter = True
    End If
End Function
Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If MINCaracter(txtCod, 10) = False Then Cancel = True
End Sub

Todo esto funciona aperfeccion, ME DA EL MENSAJE, todo perfecto solo que pretendo que el cursor DESPUES QUE DE ACEPTAR EN EL MENSAGE

 MsgBox "El " & Texto & " no contiene la cantidad de dígitos necesarios", 64, ""

el cursor no lo vea en el textBox siguiente y si en donde faltan caracteres (txtProd)

Para que complete la cantidad de caracteres (10). En el txtCod, eso es todo.

Gracias por la atención

[Hola Joaom

La macro que te pase, probé en tu archivo y funciona lo que necesitas

Adriel Ortiz, buenas tardes, disculpa la demora en responder, es que me llamaron para un trabajo y tuve que ir, pues la cosa esta mala para quedarse.

Cuant oa tu proposicion anterior que dices: Haber que tal así, peobe y casi resukto, casi porque? te dejo imagenes, explicativas;

Luego aqui está el detalle, al no seguir con la operacion y cerrar el form, me vuelve a repetir el mensaje

Le doy Aceptar y me presenta esto

Piso en Depurar, me lleva a esta linea

Aclaro que; REPITO la misma OPERACIÓN SI pero completando los 10 caracteres y sigo adelante con la operación,, refiero del mensaje repetido y el error NO se dan.

¿Por qué será?

Si se resuelve bien, si no dejemos esto así porque ya se está tomando muy largo el post y puedo llevarme alguna advertencia de la admini.

Gracias a los luchadores y bien fetores

[Hola Joaom

Creo que recién has logrado ser más claro.


Modifica las instrucciones tal como te indico.


Esto pon al principio de tu formulario

'Option Explicit
Public salir

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If MINCaracter(txtCod, 10) = False Then Cancel = True
End Sub

Function MINCaracter(wtext As MSForms.Control, cantidad)
    If Not (Len(wtext) = cantidad) And salir = True Then
        MsgBox "El " & Texto & " no contiene la cantidad de dígitos necesarios", 64, ""
        wtext.SetFocus
        MINCaracter = False
    Else
        MINCaracter = True
    End If
End Function

agrega salir = true en  Private Sub UserForm_Initialize()

Private Sub UserForm_Initialize()
   salir = True
end if

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
salir = False
End Sub

Hola Adriel, solo ahora pude verificar el correo. Llegue ahora

Mira una cosa amigo; en el evento

Private Sub UserForm_Initialize()
    With cboHojas
        .List = Array("PRODUCTOS", "CAT", "JOHN DEERE", "SILVERADO", "INTERNACIONAL")
    End With
    DTPicker1 = (Date)
    FiltrarPor.List = Array("COD PRODUCTO", "NOMBRE PRODUCTO", "UBICACION")
    '''Call BuscaCambio 'probar cambiado de aquí para el evento change del desplegable funciona mejor evitando el error al editar o ingresar nuevo
End Sub

no le veo ningun If ni End If y tu me muestras ahí en tu recomendacion un End If

Complementame con tu recomendacion, el evento por favor

Private Sub UserForm_Initialize()
salir = true
    With cboHojas
        .List = Array("PRODUCTOS", "CAT", "JOHN DEERE", "SILVERADO", "INTERNACIONAL")
    End With
    DTPicker1 = (Date)
    FiltrarPor.List = Array("COD PRODUCTO", "NOMBRE PRODUCTO", "UBICACION")
    '''Call BuscaCambio 'probar cambiado de aquí para el evento change del desplegable funciona mejor evitando el error al editar o ingresar nuevo
End Sub

asi

Si completo pasa de maravilla pero si no completo y cierro form, sigue dándome mensaje repetido y error en la misma línea.

SI PUEDES, Date tu tiempo, no hay prisa.

Como tienes el libro con tus macros repito, date tu tiempo.

Bien si se logra, si no, bien también

Probé en ambos casos que comentas

Aquí el vídeo

https://gyazo.com/b638bb745aba6266ff1c0506a323645b

Ajusta cada línea de la macro que te di

Respuesta
1

Prueba lo siguiente:

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If MINCaracter(txtCod, "Cod/Producto", 10) = False Then Exit Sub ''AQUI 10 DIGITOS Max
    Cancel = True
End Sub

Hola Dante.

Al cambiar de TextBox (evento exit)  No, me queda el cursor en el TextBox siguiente.

A ver; escribo menos de 10 caracteres en txtCod cambio al TxtBox soguiente y al hacer ese cambio de cursor, me manda el mensaje que el txtCod, no tiene los caracteres suficientes, la doy aceptar y veo que el cursor está en el txt que sigue al txtCod, no aparece en el txtCod si no en el siguiente.


Voy a tratar de adivinar.

Si capturas menos de 10 caracteres en el txtCod, entonces:

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Len(txtCod) < 10 Then
    MsgBox "no tiene los caracteres suficientes"
    Cancel = True
  End If
End Sub

No, no es adivinar, Dante, escribí:

Escribo menos de 10 caracteres en txtCod cambio al TxtBox siguiente y al hacer ese cambio de cursor, me manda el mensaje que el txtCod, no tiene los caracteres suficientes, le doy aceptar y veo que el cursor está en el txt que sigue al txtCod, no aparece en el txtCod si no en el siguiente.

Puede que no sepa explicarme como desearías, discúlpame

Resumiendo: El txtCod esta con macro para 10 caracteres MAX y 10 MIN

Escribo en el txtCod MENOS que 10 caracteres, al salir del txtCod (evento Exit) me avisa de que el txtCod no tiene la cantidad de caracteres suficiente.

En el aviso, piso aceptar, desaparece el aviso y el cursor aparece en otr oTectBox NO EN EL txtCod donde debo completar la cantidad de caracteres (10) para que pueda seguir llenando los demás textBox.

Gracias

Por si solo, con esta línea, manda aviso, CREO que no haría falta el MsgBox, creo

Aunque existe esta macro, recorriendo los módulos la vi, no me soluciona el caso

Function MINCaracter(wtext As MSForms.Control, Texto, cantidad)
'Por.Dante Amor 'Valida contenido de un textbox
    If Len(wtext) <> cantidad Then
        MsgBox "El " & Texto & " no contiene la cantidad de dígitos necesarios", 64, ""
        wtext.SetFocus 'deberia quedar el focu en el txtCod
        MINCaracter = False
    Else
        MINCaracter = True
    End If
End Function

No, no es adivinar, Dante, escribí:

Trato de adivinar porque no entiendo qué necesitas.

Olvida las funciones y el código VBA.

Explica qué necesitas, responde brevemente qué necesitas en las siguientes situaciones:

Si en el txtCod capturo menos de 10 caracteres e intento salir, ¿qué necesitas?

Si en el txtCod capturo 10 caracteres e intento salir, ¿qué necesitas?

Si en el txtCod capturo más de 10 caracteres e intento salir, ¿qué necesitas?

Escribo en el txtCod MENOS que 10 caracteres, al salir del txtCod (evento Exit) me avisa de que el txtCod no tiene la cantidad de caracteres suficiente.

En el aviso, piso aceptar, desaparece el aviso y el cursor aparece en otr oTectBox NO EN EL txtCod donde debo completar la cantidad de caracteres (10) para que pueda seguir llenando los demás textBox.

Entonces prueba el código que puse. Reemplaza tu código por esto (no necesitas una función, lo puedes hacer en el mismo evento exit):

Private Sub txtCod_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Len(txtCod) <> 10 Then
    MsgBox "no tiene los caracteres suficientes"
    Cancel = True
  End If
End Sub

Bueno, Ok. Gracias a todos los que de una manera o otra, quisieron ayudar

Veo que ni con las imágenes claras y explicitas, voy a transmitir lo que necesito.

Gracias

¿Probaste lo que te puse?

Entonces contesta esto:

Si en el txtCod capturo menos de 10 caracteres e intento salir, ¿qué necesitas?

Si en el txtCod capturo 10 caracteres e intento salir, ¿qué necesitas?

Si en el txtCod capturo más de 10 caracteres e intento salir, ¿qué necesitas?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas