Calcular Letra NIF/NIE

A menudo, en nuestras aplicaciones nos encontramos la necesidad de validad un NIF. Para ello yo utilizo dos procedimientos, uno para evaluar si el NIF pasado lleva letra, si la lleva al principio, si la lleva al final o si no la lleva y en función de la evaluación de este procedimiento se apoya del segundo pasándole el NIF para obtener la letra correspondiente y comparar si el NIF introducido por el usuario es correcto o se ha equivocado con la letra, en cuyo caso la corrige y devuelve el NIF correcto.

Para rematar, decir que estos procedmientos tienen en cuentan los NIF extranjeros que empiezan por letras como X, Y o Z.

Vamos allá, primero los dos procedimientos que tengo en un módulo:

'***********************************************
' COMPRUEBA LETRA DNI
'***********************************************
Function letra_dni(DNI)

Select Case Left$(DNI, 1) 'Orden EHA/451/2008, de 20 de febrero
Case Is = "X"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "X", "0")) Mod 23) + 1, 1)
Case Is = "Y"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "Y", "1")) Mod 23) + 1, 1)
Case Is = "Z"
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(Replace(DNI, "Z", "2")) Mod 23) + 1, 1)
Case Else
letra_dni = Mid$("TRWAGMYFPDXBNJZSQVHLCKE", (Val(DNI) Mod 23) + 1, 1)
End Select

End Function

'***********************************************
' CALCULA DNI CORRECTO
'***********************************************
Function CalculaDNI(sDNI As String) As String
'Revisamos que el DNI es correcto.

Dim miNIE As String
Dim miDNI As String
Dim NIEsinletra As String
Dim NIFsinletra As String
Dim mivar, mivar1 As Integer

miNIE = Left(sDNI, 1)
mivar1 = Asc(miNIE)
miDNI = Right(sDNI, 1)
mivar = Asc(miDNI)
NIEsinletra = Left(sDNI, 8)
NIFsinletra = Left(sDNI, 8)

If mivar1 > 47 And mivar1 < 58 Then 'Si el primer caracter es un número If mivar > 47 And mivar < 58 Then 'Si el último carácter no es una letra CalculaDNI = sDNI + letra_dni(sDNI) Else 'Si el último carácter es una letra If miDNI = letra_dni(NIFsinletra) Then 'Si el último carácter es una letra y la letra es correcta CalculaDNI = sDNI Else 'Si el último carácter es una letra y la letra no es correcta MsgBox "La letra del DNI introducida es errónea. Debería ser " & letra_dni(NIFsinletra), vbInformation CalculaDNI = NIFsinletra + letra_dni(NIFsinletra) End If End If Else 'Si el primer caracter es una letra If mivar > 47 And mivar < 58 Then
'Si el último carácter no es una letra
CalculaDNI = sDNI + letra_dni(NIEsinletra)
Else
'Si el último carácter es una letra
If miDNI = letra_dni(NIEsinletra) Then
'Si el último carácter es una letra y la letra es correcta
CalculaDNI = sDNI
Else
'Si el último carácter es una letra y la letra no es correcta
MsgBox "La letra del DNI introducida es errónea. Debería ser " & letra_dni(NIEsinletra), vbInformation
CalculaDNI = NIEsinletra + letra_dni(NIEsinletra)
End If
End If

End If
End Function

Como usarla:

Desde un cuadro de texto de nuestro formulario destinado a introducir el NIF y en su evento «Después de Actualizar», hacemos la llamada así:

Private Sub txtDNI_AfterUpdate()

Me.txtDNI = CalculaDNI(Me.txtDNI)

End Sub

Si estás interesado en aprender mas puedes solicitar información sobre nuestros cursos de programación orientada a objetos con Visual Basic para Access.

5 comentarios

  1. Hola,

    Estoy intentando usar este codigo en access 2007 y no me funciona, como si la llamada al modulo CalculaDNI no la encontrase. Es correcto el como llamarlo desde el txt del dni? ¿tiene que tener ese nombre el campo o puede tener otro nombre?

    Saludos y gracias

    1. Hola Luis, vuelve a copiar el texto pues me di cuenta del que el plugin que utilizo para formatear el código no estaba funcionando bien y me metía caracteres raros de por medio. Lo he corregido otra vez. Prueba a ver si te funciona.

      Un saludo.

  2. esta bien tener esta información, yo encontré esta página donde te lo calculan al instante. Os la dejo por si os puede servir de ayuda en algun momento letra dni

  3. Hola a todos:

    Únicamente deciros que la razón de ser de los caracteres de control en los NIF es chequear que la cadena introducida es correcta.

    Por ello si la cadena introducida por el usuario tiene un error y el carácter de control que calculamos no coincide con el valor que tiene el de la cadena el usuario ha tecleado debe ponerse en su conocimiento, para que el usuario verifique dónde está el error y lo corrija.

    Es un tremendo error, que dará la cara posteriormente, el que «corrijamos» la información introducida por el usuario.

    Os lo aclaro con un ejemplo:

    Un ciudadano tiene el NIF 12345678Z. Si el usuario de una aplicación introduce en el campo NIF la cadena 02345678Z, que tiene un error mecanográfico al cambiar el «1» inicial por un «0», la validación evidentemente será errónea, ya que para «02345678» la letra de control que nos da la función es T.

    Por ello si corregimos el valor introducido por el usuario, y en nuestra aplicación guardamos como NIF el valor «02345678T» estamos cometiendo un ERROR MAYUSCULO.

    Creo que por tanto debemos informar del error y NADA MAS.

    Saludos

  4. Hola Angel, he intentado aplicar el código que indicas (me tomé la libertad de nombrar al módulo «ValidarDNI») y cuando actualizo me presenta el mensaje de error: «…se esperaba un procedimiento… no un módulo…»

Responder a letra dni Cancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.