Setfocus en Combobox de un Userform con AfterUpdate

Tengo un formulario con varios combobox, estoy poniendo algo así como...

Private Sub Combobox1_AfterUpdate()
   If IsNumeric (Combobox1.Text) = False Then
      MsgBox "Deben de ser números", vbCritical, "Error"
      Combobox1 = ""
      Combobox1.Setfocus
   End If
End Sub

Y pasa que no regresa el foco al combobox1 sino que se va al combobox2, no uso change porque al apretar una tecla, selecciona automáticamente el primer resultado que se parezca dentro del textbox y eso no me sirve.

¿Alguna idea?

3 respuestas

Respuesta
2

Tus instrucciones mencionan un combobox... pero al final hablas de un textbox.

No esta muy clara la situación, lo que si esta claro es que parece que no estas utilizando el control adecuado.

Un combobox sólo te muestra y por ende te permite seleccionar los valores que autorizas de antemano. Si sólo deben seleccionarse números el combo debe presentar una lista de números nada más.

Revisa este concepto y si te queda alguna duda solicita aclaraciones. O envíame tu libro para que revise esta situación.

Sdos.

Elsa

http://aplicaexcel.galeon.com/index.htm

Hola Elsa, de nuevo ayudándome, muchas gracias!

Tienes toda la razón, me equivoqué, quise decir combobox, no textbox, me pongo a trabajar de noche, soy de México cuando se me terminan las ideas y las respuestas de google vengo para aca, por ahí de las 4am y entenderás porqué el error.

Te cuento que sí, la idea es que se seleccionen sobre todo las opciones establecidas en el combobox, pero de hecho, estoy poniendo en el código que avise, que la matrícula (es decir el número de control del trabajador que estoy ingresando), no se encuentra entre las opciones, pregunte si quieres capturarlo de todas formas, no siempre son los mismos trabajadores y tal vez es una alta que no ha sido actualizada en la base de datos. 

En caso de que le pongas que sí lo inserte, en caso de que le pongas que no, regrese el foco al combobox1, y esa es la cuestión. Cómo ves?

Saludos.

Entonces debes cambiar de evento. En lugar de AfterUpdate utilizá Exit.

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'x Elsamatilde
'si no es número envía mensaje, limpia el control y permite ingresarlo nuevamente
If Not IsNumeric(ComboBox1.Text) Then
    MsgBox "Deben de ser números", vbCritical, "Error"
    ComboBox1 = ""
    Cancel = True
End If
End Sub

Esto responde a tu consulta puntualmente. Para agregar otras opciones como consultar si desea o no registrar un nuevo registro por favor deja la consulta con su respectivo título en el tablón y con mucho gusto lo seguiré tratando.

Elsa de nuevo tú respuesta es correcta, cambiando el afterupdate por exit hace que al poner que no, se borre el combobox1 y se quede el foco ahí, pero me crea un nuevo problema y más grave. Te lo expongo a ver si me puedes ayudar.

Al dar que si, debería de continuar ahora sí, a un textbox, el textbox3, sin embargo me repite el msgbox 2 veces para luego marcarme un error, traté replicando el Cancel = true pero de todos modos marca el erro. Qué opinas?

Te dejo capturas

Las instrucciones que te dejé eran para evitar que se salga del combo 'cuando se ingresa un valor no numérico'... así fue la solicitud.

No sé xq quitaste la instrucción Cancel = true.

Volvela a activar tal como te la envié y quita la que colocaste debajo del textbox.

Luego probala nuevamente y me comentas el resultado. Pero por favor no olvides lo que te comenté en respuesta anterior:

'... Esto responde a tu consulta puntualmente. Para agregar otras opciones como consultar si desea o no registrar un nuevo registro por favor deja la consulta con su respectivo título en el tablón y con mucho gusto lo seguiré tratando...

Sdos!

¡Gracias! Matilde estábamos trabajando en diferentes partes del relajo que tengo por código, disculpa, soy un amateur aprendiendo de google y de ti. Yo estaba probando con la parte que dice 

respuesta = MsgBox("Matrícula no está en la base de datos ¿Deseas capturarla de todas formas?", vbYesNo)
                        If respuesta = vbYes Then

con eso estaba haciendo la prueba que básicamente es el mismo problema que estábamos tratando, que limpiara el combobox y dejara el cuadro ahí.

Es verdad, la pregunta ha sido respondida aunque esto me ocasiona otro problema un poco más abajo, voy a postear la siguiente pregunta como me sugieres.

Muchas gracias por toda la ayuda!

Respuesta
1

Pásale el foco a otro control y luego de vuelva al combo:

Private Sub Combobox1_AfterUpdate()
   If IsNumeric (Combobox1.Text) = False Then
      MsgBox "Deben de ser números", vbCritical, "Error"
      Combobox1 = ""
      Combobox2.Setfocus
      Combobox1.Setfocus
   End If
End Sub

Hola, muchas gracias por la ayuda, lo intenté y no funciona. El foco se queda en el control que pongo antes de regresarlo al combobox1. Alguna otra idea?

Saludos!

Revisando tu código, tienes mal la condición: quieres que el mensaje salga si metes texto, entonces debiera ser:

Private Sub Combobox1_AfterUpdate()
   If Not IsNumeric (Combobox1.Text) = False Then
      MsgBox "Deben de ser números", vbCritical, "Error"
      Combobox1 = ""
      Combobox2.Setfocus
      Combobox1.Setfocus
   End If
End Sub

A mí siempre me funcionó pasar el foco a otro campo antes de devolverlo...

Respuesta
1

Prueba utilizando docmd. Gotocontrol "Combobox1"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas