Instrucción para varios TextBox de un formulario ejecutable con Enter

Buenas tardes, llevo varios meses tratando de resolver este problema, pero me ha superado y opte por pedir ayuda.

Diseñe un formulario tal como se aprecia en la imagen (desarrollado en Excel 2007) dicho formulario se usa como cotizador, se ingresan datos de clientes, Realiza algunos cálculos y entrega valores dependiendo de ciertas condiciones, después dichos valores se capturan en tres hojas diferentes al dar click al botón "grabar".

Mi problema es el siguiente: en el Frame "Examenes" (ver imagen) tengo varios TextBox agrupados en 6 columnas identificadas con la etiqueta codigo, cant, examen, copago, part e indicacion respectivamente. La idea es ingresar un código de 4 dígitos en cada uno de los textbox que se agrupan en la columna etiquetada como código, y al hacer Enter este código es buscado y capturado por el textbox, capturando de paso el contenido de los otros textbox adyacentes de la misma fila (la información de captura se extrae de una hoja que funciona como base de datos llamada "examen". La búsqueda la tengo resuelta de dos maneras:

Método 1

'Private Sub id_examen1_AfterUpdate()

'On Error Resume Next

'exam1.Value = WorksheetFunction.VLookup((id_examen1.Value), Sheets("examen").Range("A2:K485"), 2, False)

'copago1.Value = WorksheetFunction.VLookup((id_examen1.Value), Sheets("examen").Range("A2:K485"), 10, False)

'part1.Value = WorksheetFunction.VLookup((id_examen1.Value), Sheets("examen").Range("A2:K485"), 8, False)

'End Sub

Método 2

'Private Sub id_examen1_AfterUpdate()
'
'Set h = Sheets("examen")
'Set b = h.Columns("A").Find(id_examen1)
' If Not b Is Nothing Then
' exam1 = h.Cells(b.Row, "B")
' copago1 = h.Cells(b.Row, "J")
' part1 = h.Cells(b.Row, "H")

' End If

'End Sub

El inconveniente, radica en que tal como tengo el código visual basic, me veo obligado a programar los textbox de la primera columna uno por uno quedando un código de programación muy extenso que me arroja un error por superar el numero de lineas del editor VBA. Intente programar con un bucle For To al inicializar el formulario pero no hace nada, les dejo el código de todos modos:

'Dim codigo As Controls
'Dim cantidad As Controls
'Dim examen As Controls
'Dim copago As Controls
'Dim particular As Controls
'Dim i As Integer
'
'For i = 1 To 18
'
'cantidad = Me.Controls("cant" & i).Text
'examen = Me.Controls("exam" & i).Text
'copago = Me.Controls("copago" & i).Text
'particular = Me.Controls("part" & i).Text
'
'On Error Resume Next
'examen.Value = WorksheetFunction.VLookup((codigo.Value), Sheets("examen").Range("A2:K485"), 2, False)
'copago.Value = WorksheetFunction.VLookup((id_examen1.Value), Sheets("examen").Range("A2:K485"), 10, False)
'particular.Value = WorksheetFunction.VLookup((id_examen1.Value), Sheets("examen").Range("A2:K485"), 8, False)
'
'Next

Quería solicitar si alguien mas experto me puede ayudar indicándome que estoy haciendo mal o si la idea que tengo es muy marciana.

Des afortunadamente, NO soy del área de programación y todo lo que he logrado aprender a sido a punta de foros y tutoriales de la web.

Agradezco infinitamente vuestra atención y quedo atento a los comentarios.

1 Respuesta

Respuesta
1

Usando un módulo de clase y un objeto con eventos creo que es posible hacer más o menos lo que necesitas. Mira si te sirve este ejemplo para empezar:
http://www.jrgc.es/ejemplos/ejemplo_20161107a.xlsm
Al teclear un código de 4 dígitos de los que hay en la hoja, aparecerá a su derecha la descripción.

Los 5 controles id_examen del formulario son manejados por un único código, que está en el evento id_examen_Change de la clase cl_id_examen, así que en principio da igual que sean 5 ó 50
Saludos_

¡Gracias! jrgces, estoy fuera de la ciudad en este minuto apenas llegue a mi casa reviso con calma el código te cuento y valoro la respuesta, agradezco infinitamente tu gentileza.

saludos

Buenos días jrgces, no se si te ha pasado que en alguna ocasión llevas mucho tiempo tratando de resolver un problema y de pronto llega alguien te pregunta y en un segundo lo resuelve todo, queda ese asombro y esa pregunta forzada ¿como lo hizo?. bueno eso me paso con tu respuesta.

Con respecto al código, funciona muy bien y es exactamente lo que estaba buscando, lo que si, hubo algunos detalles que trate de pulir un poco y te los comento por si hubiese algún alcance que no tenga previsto:

como se trata de tres textbox mas, aparte de "descripción", que se deben buscar en la fila correspondiente al  id_examen, genere anidamientos del If Then Else y logre hacer las búsquedas restantes:

Hubo una omisión por mi parte que después de ver el código note que debí haberla planteado desde el comienzo se trata de lo siguiente:

id_examen        examen

2047                 Glicemia en ayunas

2047A              Glicemia post carga

2047B              Glicemia pos desayuno

Como puedes ver se trata de la misma familia de exámenes por ello comparten la raíz del código, pero es un examen tomado en diferentes condiciones, por ende se diferencian con una letra. En el modulo de clase se contempla esto:

 If Len(id_examen) = 4 Then, el cual permite solo códigos de 4 caracteres para iniciar la búsqueda, para resolver la situación y lograr que hiciera la búsqueda con los demás, hice esto:

 If Len(id_examen) > 3 Then,

lo que desconozco es el alcance de aquello.

Otro detalle que no logre resolver, es que se se trata de 18 textbox que alojan un id_examen con su respectiva búsqueda (id_examen1, id_examen2 ... id_examen18), pero al parecer tal como esta el código, contempla id_examen con solo un dígito ya que lo puedo hacer hasta el id_examen9, cambiando por supuesto el For n = 1 To 9, al igual que la variable 

Dim cl_id_examen(1 To 9) As New cl_id_examen

supuse que el tema debe estar en la función Mid del id_examen, pero no tuve la claridad suficiente para replantear la sintaxis, excepto que se trate de otra instrucción.   

If vBúsqueda <> "" Then id_examen.Parent.Controls("descripción" & Mid(id_examen.Name, 10, 9)).Value = WorksheetFunction.Index([Hoja1!B:B], vBúsqueda)

un dato que no te había informado, es que la propiedad TabIndex de los textbox no esta correlativa en el formulario, supuse que podría estar ahí también el problema. Si pudieras ayudarme en ese punto por favor.

El ultimo punto, y se me ocurre que debe ser el mas complejo de todos, es preguntarte si es factible que el modulo de clase contemple la búsqueda al presionar "Enter", esto pensado en el usuario que a veces tendrá códigos muy parecidos y puede dar por echo que escribió en forma correcta. 

Mil gracias por tu ayuda y estoy atento a tus comentarios

Manuel

A mí no me da problemas tener más de 9 controles. Lo que pasa es que lo que va antes de su número (en el ejemplo "descripción") ha de llamarse siempre igual. He subido un ejemplo con 12 controles id_examen y sus correspondientes descripciones: http://www.jrgc.es/ejemplos/ejemplo_20161110a.xlsm
En este ejemplo la búsqueda de la descripción asociada al código se produce al pulsar la tecla entrada. Si no encuentra el código, ambos textboxes quedan en blanco.
Saludos_

¡Gracias! quedo impecable, tenias razón, que el código era aplicable a cualquier numero de TextBox, el error que ,me arrojaba se debía a otro código que tenia entre medio, pero al fin me pude dar cuenta. No sabes lo agradecido que estoy, Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas