Verificar al escribir, valores en 120 campos de texto
En el formulario tengo 120 objetos de texto para generar los colores RGB. Obviamente los valores de cada uno está limitado a valores entre 0 y 255.
¿Cómo se puede hacer para que se valide el rango válido en cada uno de esos 120 objetos con un único código de validación?
De solo pensar en crear un código y "llamarlo" desde los 120 objetos me da náuceas de la desesperación.
1 Respuesta
Hay varias formas de validar, en este caso se debe validar que solo se admitan valores numéricos al presionar una tecla, es decir, números entre 0 y 9. Igualmente, se deben validar todos campos que tengan valor y que estén comprendidos entre 0 y 255.
Formulario con los datos
Este formulario requiere que en Propiedades eventos, Tecla de Vista Previa esté en SI. Esto es para que detecte el evento Al Presionar una tecla, con el fin de obligar a solo números.
Tengo el siguiente formulario para ingresar los valores (incluí solo algunos de los 120)
Ingreso los valores:
Si hago clic sobre el botón obtengo de la imagen anterior cambia el color de fondo y muestra el siguiente mensaje:
Observe como cambia a fondo Amarillo los campos cuyo valor sea superior a 255 y deja en fondo azul los correctos.
Código del botón Validar
Evento a nivel del formulario, Al presionar una tecla
Funciones necesarias
Se debe crear un módulo de VBA con las siguientes funciones:
Módulo funciones. Se debe crear un módulo de VBA con las siguientes funciones:
Función SoloNros
Función validar() para validar todos los campos tipo TexBox:
Ya podrá hacer otras modificaciones, no validé por cada campo el valor, porque tendría que realizar 120 validaciones. Espero que este ejemplo le quite las "náuseas.. jaja", Si quiere el ejemplo lo puede solicitar a [email protected], favor anotar en el asunto la consulta.
Modifiqué las funciones, para solo valide solo números al presionar una tecla en campos Texto, con esto no valida otros tipos de campo, por ejemplo, cuadro combinado. Si hay campos texto que no se deben validar implica modificar la función SoloNros().
Funciones editadas
El texto encerrado en rojo son los cambios.
¡Nunca hubiera logrado eso! No conocía Screen.activeform y demás...
Ahora, ¿hay alguna forma de llamar a "Validar" sin necesidad de un botón o no tener que llamarlo desde cada campo al abandonarlo?
Porque necesito que devuelva un mensaje cuando abandona el objeto y cuando el valor no cumple la validación (mínimo 0 y máximo 255).
No es necesario llamar la función desde cada campo para esto utilizo Screen. ActiveForm. Controls, de tal forma que se pueda llamar antes de actualizar o insertas los datos. Claro "Validar" es una función pública y se puede llamar desde cualquier parte. Todo depende, si los controles a validar corresponden a una tabla dependiente, tiene que llamar la función en el evento Antes de actualizar a nivel del formulario. Por ejemplo:
Pero en caso que los controles sean independientes debe validar antes de grabar, algo como:
Como está el ejemplo anterior si además de los 120 controles tiene otros que no hacen parte de la validación se presentan 2 problemas, uno que en estos controles no podrá ingresar caracteres de texto y segundo, la función entrará a validar estos controles. En consecuencia se deben hacer los siguientes cambios en las 2 funciones y a los campos que no deben validarse en la propiedad Información adicional, debe anotar aquí cualquier texto, por ejemplo No.
Formulario con controles obligatorios y controles excluidos de la validación.
Tengo este formulario, observe que en la parte superior están los controles que se deben validar y en la parte inferior están los que no se deben validar, estos tienen la Propiedades, Otras, Información adicional la palabra "No". En el ejemplo el campoTexto4 tiene el valor 567 y no se tuvo en cuenta porque tiene la información adicional en No.
Si mando a validar este sería el resultado
Efectivamente el único campo es el Texto0 que tiene el valor de 678.
Propiedad de los campos texto que no se deben validar
Funciones modificadas
Observe como utilizo la propiedad Tag, para hacer referencia a la información adicional del campo, si es vacío lo valido, pero si tiene algún texto No se valida. Bueno espero le sirva y tenga suficiente información.
El hacer la validación al guardar me impide tomar una "vista previa" del color en la medida que se ingresan los valores.
Al modificar el color Rojo para Encabezado, en el marco "Original" deberá verse reflejado con el valor recientemente modificado. Por ende, necesito que el valor del campo sea válido en el mismo instante en que se abandona (o intenta abandonar) el campo en cuestión.
Para validar a nivel de campo tendría que modificarla pero implica llamarla 120 veces, entonces no va con su pregunta inicial. Voy a estudiar su caso que no es fácil.
Yo no dejaría que el usuario digite el número del color, lo obtendría mediante llamada a la API ChooseColor, como muestra la figura.
Utilizo esta técnica en un software que elaboré para hacer boletos de rifas. No sé como adaptar esto para sus 120 campos aunque en la imagen que muestra no los veo.
¡Esa alternativa me voló la cabeza porque es por mucho más práctica y estoy totalmente de acuerdo en que es por mucho mejor. ¿Cómo se usa?
Para obtener el color necesita incluir el siguiente código en un módulo de VBA.
Función choosecolor de la librería comdlg32.DLL
LLAMADA DESDE UN FORMULARIO
Observe que coloqué 2 campos;
Número del Color - En este llamo la función, lo llamo ctlEjemplo
Resultado del Color - En este fijo el color, no obstante, sobre porque el color se puede fijar en primer campo. Lo llamo ctlColor.
CÓDIGO DEL CAMPO NÚMERO DEL COLOR
FORMULARIO EN EJECUCIÓN
RESULTADO FINAL
Observe que en el procedimiento envío el color al campo "Resultado del Color", pero si usted quiere puede dejarlo en el mismo campo "Número del Color", algo como:
Ahora, si prefiere puede cambiar ForeColor por BackColor. Bueno espero le sirva, se me agotaron los conocimientos.
No lo he probado pero creo que esto es muchísimo más práctico.
Ahora surge el cómo convertir el número de color a RGB para usarlo o cómo usar el número obtenido para colorear el formulario...
A ver si entendí:
Ahora hago esto para aplicar el colo:
Me.NombreControl.BackColor = RGB(190,0,0)
Ahora debería usarlo:
Me.NombreControl.BackColor = 1245678 (entendiéndose que el número es el color).
Esto porque lo he de almacenar en una tabla donde el usuario de la base de datos podrá personalizar colores de la interfaz. Por ende, al abrir, llamará a los valores y los aplicará. Actualmente tengo "Temas" prearmados guardados en un módulo por lo que llamo al módulo y aplico la "paleta". Pero para la opción personalizable llamaría al valor almacenado en la tabla del registro del usuario para aplicarlo al objeto, a los bordes, al fondo del formulario, etc.
De acuerdo con el ejemplo
Me.ctlEjemplo.Value=aDialogColor(Me.ctlEjemplo)
Me deja en el control el número 8421440, este valor es que de alguna manera lo debe registrar y vincular con el usuario para que lo personalice y ahí como usted lo indica:
Me.NombreControl.BackColor =8421440
Cuando ingrese el usuario le asignará este valor de color al control, esa es la idea. Es correcto como lo expone, pero no olvide llamar la función que devuelve el valor numérico.
No me ha funcionado. El diálogo para elegir o generar color nunca se abre sino que simplemente asigna el valor 0.
Lo único es que me envíe el formulario a [email protected] y lo reviso.
Le envié el archivo. No es el que voy a usar sino uno de prueba replicando con nombres y todo el de su ejemplo...
He visto que esa DLL tiene problemas con Windows 10 de 64 bits o algo así. ¿Quizá será por eso? Tengo tanto Windows como Office x64.
No creo que sea Windows trabajo con 64 bits, el problema puede ser Access no lo he probado en Access de 64 bits
Este el motivo porque no desarrollo con Access de 64 causa muchos problemas y el de 32 bits no se ve afectado en nada, le recomiendo Access de 32 si no va trabajar con aplicativo WEB no necesita el de 64.
Le envíe a su correo un ejemplo para Access de 32y 64, no obstante, si quiere solo modifique estas líneas.
- Compartir respuesta