Access, Excel, VBA y más

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.

Salir de la versión móvil