Regla de validación para forzar valores alfanuméricos

Tengo un formulario en Access con un campo que debe de leer un valor alfanumérico de una tarjeta magnética (Ej: "5A5F3404") y lo relaciona mediante la tabla "Personal" con el numero de personal de cada uno, así como su nombre y apellidos.

Me encuentro con el problema de que hay gente que escribe su nombre en el campo en lugar de leer la tarjeta, creando problemas a la hora de asociar este valor a un operario en concreto.

Lo que me gustaría hacer es crear algún tipo de regla de validación para que después de actualizar, si el valor fuera solo alfabético (Ej: Javier Fernández), lo rechazara, y que solo aceptara valores con números y letras tales como los que tienen todas las tarjetas.

1 Respuesta

Respuesta
2

Con un regla de validación, difícil... con una validación por código, sencillo:

Private Sub NombreCampo_AfterUpdate()
Dim i As Integer
Dim hayNum As Boolean
hayNum = False
If Nz(Me.NombreCampo, "") = "" Then Exit Sub
For i = 1 To Len(Me.NombreCampo)
If IsNumeric(Mid(Me.NombreCampo, i, 1)) Then
hayNum = True
Exit For
Next i
If hayNum = False Then
MsgBox "El dato introducido no es correcto"
Me.NombreCampo = ""
End If
End Sub

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

¡Gracias Sveinbjorn!

Lo puse en marcha ayer y a priori funcionaba.

Esta noche hemos descubierto que las tarjetas del personal externo, que también deben de utilizar la base de datos, resulta que también pueden ser totalmente numéricas o comenzar por una letra en lugar de un numero, por lo que este código da por erróneo varias de sus tarjetas.

Sin embargo investigando como funcionaba tu código he descubierto varias funciones que desconocía como por ejemplo Len. Me han asegurado que todas las tarjetas devuelven un numero de 8 dígitos, así que creo que limitaré la entrada de datos por ahí

Nuevamente, muchas gracias.

Pues no debería dar error con esas tarjetas, porque lo que hace el código es mirar uno por uno todos los caracteres (con el For Next) y cuando encuentra el primer número, marca a True la variable hayNum y ya da por buena la cadena que contiene el cuadro de texto... (Y lo he comprobado varias veces)

Por cierto, que acabo de ver un error en el código, que seguro que ya te lo chivó el editor de VBA: falta un End If antes del Next i:

Private Sub NombreCampo_AfterUpdate()
Dim i As Integer
Dim hayNum As Boolean
hayNum = False
If Nz(Me.NombreCampo, "") = "" Then Exit Sub
For i = 1 To Len(Me.NombreCampo)
  If IsNumeric(Mid(Me.NombreCampo, i, 1)) Then
    hayNum = True
    Exit For
  End If
Next i
If hayNum = False Then
  MsgBox "El dato introducido no es correcto"
  Me.NombreCampo = ""
End If
End Sub

¡Gracias otra vez!

Ayer me dí cuenta del End if que faltaba, pero por error o ignorancia (más bien la segunda) lo incluí antes del Exit For en lugar de después.

Si bien esto me sirve para recordarme lo peligroso de incluir un código que no acabo de entender, por mucho que a priori haga la faena.

Ademas con la tontería, me sirvió para descubrir las funciones Len, Nz, y con tu explicación de ahora, acabo de entender claramente como funciona el For, así que no hay mal que por bien no venga. Siempre he preferido entender las cosas a simplemente arreglarlas.

Lo he estado probando con las tarjetas que daban error y ya no lo hacen, así que gracias, tanto por la solución como por la explicación.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas