Public Function GetNIF(ByVal strNIF As String) As String
'*******************************************************************
' Nombre: GetNIF
' por Enrique Martínez Montejo
'
' Finalidad: Devuelve la letra correspondiente al NIF o al NIE
' (Número de Identificación de Extranjero)
'
' Entradas:
' NIF: String. La cadena del NIF cuya letra final se desea
' obtener.
'
' Resultados:
' String: La letra del NIF/NIE.
'
'*******************************************************************
Dim firstChar As String
Dim DNI As Double
Dim r As Integer
' Primer carácter del NIF.
firstChar = UCase(Left(strNIF, 1))
Select Case firstChar
' Dependiendo del primer caracter del NIF pasado, se tratará
' de un colectivo u otro de personas o entidades.
Case "K", "L", "M"
' Colectivos especiales de personas físicas. El cálculo
' del dígito de control es igual que para el NIF, previa
' eliminación de la primer letra del NIF especificado.
strNIF = Mid(strNIF, 2)
Case "X", "Y", "Z"
' Es un número de extranjero (NIE). El NIE puede estar formado por
' 9 ó 10 caracteres, dependiendo si existe lo que se conoce como el
' peso del número (0, 1 ó 2), después de la letraun inicial: el primer
' carácter es una letra, seguido de un 0, 1 ó 2 y 7 dígitos, y
' finaliza con el dígito de control, por ejemplo:
' X-0-1234567-L
' Y-1-1234567-X
' Z-2-1234567-R
' En primer lugar, eliminamos la letra del NIE, la cual se
' encuentra almacenada en la variable «firstChar».
strNIF = Mid(strNIF, 2)
' Comprobamos la longitud del número del NIE, para quedarnos
' con sus últimos 7 caracteres. Posteriormente se le añadirá
' el peso que se corresponda con la letra del NIE especificada.
Select Case Len(strNIF)
Case Is > 8
GetNIF = "ç"
Case 8
' Me quedo con los últimos 7 caracteres
strNIF = Right(strNIF, 7)
Case Else
' Completo con ceros a la izquierda del número especificado
' hasta alcanzar los siete caracteres de longitud.
strNIF = Left(strNIF & String(7, "0"), 7)
End Select
' Dependiendo de la inicial del NIE, se le concatenará su correspondiente
' peso (0 para la X, 1 para la Y y 2 para el caso de la Z), de tal manera
' que el número intermedio del NIE quede formateado con una longitud
' de 8 caracteres: peso (1 carácter) + número (7 caracteres).
Select Case firstChar
Case "X"
' La cadena comenzará por el carácter 0.
strNIF = "0" & strNIF
Case "Y"
' La cadena comenzará por el carácter 1.
strNIF = "1" & strNIF
Case "Z"
' La cadena comenzará por el carácter 0.
strNIF = "2" & strNIF
Case Else
' No es un NIE válido.
GetNIF = "ç"
End Select
Case Else
' Si por casualidad el primer carácter es una letra
' que no se corresponde con ninguna entidad o colectivo
' especial, se abandonará el procedimiento.
If Not IsNumeric(firstChar) Then
GetNIF = "ç"
End If
' Es un NIF de una persona física. Si la longitud es
' mayor de 8 caracteres, abandonamos la función.
If Len(strNIF) > 8 Then
GetNIF = "ç"
End If
End Select
' Tabla del NIF
' 0T 1R 2W 3A 4G 5M 6Y 7F 8P 9D
' 10X 11B 12N 13J 14Z 15S 16Q 17V 18H 19L
' 20C 21K 22E 23T
'
' Procedo a calcular el NIF/NIE
' La operación consiste en calcular el resto de dividir el DNI
' entre 23 (sin decimales). Dicho resto (que estará entre 0 y 22),
' se busca en la tabla y nos da la letra del NIF.
' Convertimos a entero el número alfanumérico del NIF.
DNI = CDbl(strNIF)
' Obtenemos el resto de la división.
'
r = DNI Mod 23
' Obtenemos el dígito de control del NIF
GetNIF = Mid("TRWAGMYFPDXBNJZSQVHLCKE", r + 1, 1)
End Function