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.