Hojas de cálculo en Excel - página principal

Calcular la letra del NIF (o del DNI)

Hoy os presento una utilidad bastante sencilla, y que muchos ya conocéis, especialmente los españoles, pues esta utilidad es de aplicación por estas tierras de Dios. Vamos a tratar de obtener la letra del NIF (Número de Identificación Fiscal) o la letra del DNI (Documento Nacional de Identidad), pues desde hace ya unos años, el DNI también incorpora la famosa letra de marras.

Antes de comenzar, veremos como se determina la letra que le corresponde a un NIF (o DNI), y luego pondremos eso en práctica de diferentes formas: utilizando una función personalizada, y utilizando un macro.

Para calcular la letra, tomaremos el número del NIF (o del DNI), y lo dividiremos entre 23, y al resto que obtengamos de esa división, le sumaremos 1. Esa cifra nos servirá para asignarle una letra al NIF/DNI. El número máximo que obtendremos después de hacer esa operación, será el 24. Veamos todo esto con un ejemplo práctico:

Si tenemos el NIF/DNI número 30.655.784, con esta fórmula que podemos poner en cualquier celda, obtendremos ese número:


=RESIDUO(30655784;23)+1

En lugar de poner directamente en la fórmula, el número del NIF/DNI, podemos poner la referencia a una celda (A1, A23, B12, M55, etc...), siempre y cuando, en esa celda tengamos el número del NIF/DNI.

Esa fórmula de nuestro ejemplo, nos devuelve como cifra, el número 5. Ahora solo nos bastará obtener la letra a partir de ese número, a través de la siguiente tabla:

1 = T
2 = R
3 = W
4 = A
5 = G
6 = M
7 = Y
8 = F
9 = P
10 = D
11 = X
12 = B
13 = N
14 = J
15 = Z
16 = S
17 = Q
18 = V
19 = H
20 = L
21 = C
22 = K
23 = E
24 = T

Siguiendo con el ejemplo anterior, podemos observar que al 5, le corresponde la letra G, con lo cual, al NIF/DNI 30.655.784, le corresponde la letra G.

Vamos a ver como se puede resolver esto con una función personalizada:

Function LetraNIF(NIF As Long)
'Controlamos que no sea un número
'mayor de 8 cifras

If NIF = 0 Or NIF > 99999999 Then
LetraNIF = "NIF incorrecto"
Else
'Dividimos el NIF entre 23, y nos
'quedamos con el resto

resto = (NIF Mod 23) + 1
'la línea anterior la podíamos haber complicado
'poniendo esto otro:
'resto = NIF - ((Int(NIF / 23)) * 23) + 1
'Ahora seleccionaremos la letra que
'le corresponda al NIF introducido,
'dependiendo del resto obtenido

Select Case resto
Case 1, 24
LetraNIF = "T"
Case 2
LetraNIF = "R"
Case 3
LetraNIF = "W"
Case 4
LetraNIF = "A"
Case 5
LetraNIF = "G"
Case 6
LetraNIF = "M"
Case 7
LetraNIF = "Y"
Case 8
LetraNIF = "F"
Case 9
LetraNIF = "P"
Case 10
LetraNIF = "D"
Case 11
LetraNIF = "X"
Case 12
LetraNIF = "B"
Case 13
LetraNIF = "N"
Case 14
LetraNIF = "J"
Case 15
LetraNIF = "Z"
Case 16
LetraNIF = "S"
Case 17
LetraNIF = "Q"
Case 18
LetraNIF = "V"
Case 19
LetraNIF = "H"
Case 20
LetraNIF = "L"
Case 21
LetraNIF = "C"
Case 22
LetraNIF = "K"
Case 23
LetraNIF = "E"
End Select
End If
End Function

Y llamaremos a la función, desde excel, de la siguiente forma:

=letraNIF(celda)

celda: corresponde a la celda donde tenemos el NIF/DNI (A12, B33, M58, o la celda de que se trate), aunque podemos poner directamente el NIF/DNI en la fórmula, sin necesidad de referenciarlo a una celda.

Quizás te preguntes: "¿Se puede resumir esa función, para que no sea tan larga?". La respuesta es sí. Vamos a aplicar esta otra función que hace exactamente lo mismo, pero con menos líneas de código (ojo, a esta nueva función la llamaremos "LetradelNIF", mientras que la que acabamos de ver se llama "LetraNIF"):

Function LetradelNIF(NIF As Long)
'Controlamos que no sea un número
'mayor de 8 cifras

If NIF = 0 Or NIF > 99999999 Then
letradelNif = "NIF incorrecto"
Else
'Tenemos una constante que contiene las
'posibles letras que puede tener un NIF

Lista_de_letras = "TRWAGMYFPDXBNJZSQVHLCKE"
'Cogemos el NIF, lo dividimos entre 23
'y nos quedamos con el resto. Luego
'al resto le sumamos 1, y obtenemos de
'la lista de letras, la que corresponda
'con ese número de NIF

letradelNif = Mid(Lista_de_letras, (NIF Mod 23) + 1, 1)
End If
End Function

Y llamaremos a la función, desde excel, de la siguiente forma:

=letradelNIF(celda)

celda: corresponde a la celda donde tenemos el NIF/DNI (A12, B33, M58, o la celda de que se trate), aunque podemos poner directamente el NIF/DNI en la fórmula, sin necesidad de referenciarlo a una celda.

Si no queremos usarla con una función, y preferimos utilizar un inputbox para que el usuario introduzca el NIF/DNI, y nosotros devolvamos la letra en una celda cualquiera, podemos utilizar este procedimiento (en el ejemplo pondremos la letra que le corresponda al NIF/DNI introducido, en la celda B18):

Sub calcular_letra_del_NIF()
NIF = InputBox("Introduce el NIF cuya letra quieres calcular:", "NIF")
'Controlamos que no sea un número
'mayor de 8 cifras

If NIF = 0 Or NIF > 99999999 Then
Range("B18") = "NIF incorrecto"
Else
'Tenemos una constante que contiene las
'posibles letras que puede tener un NIF

Lista_de_letras = "TRWAGMYFPDXBNJZSQVHLCKE"
'Cogemos el NIF, lo dividimos entre 23
'y nos quedamos con el resto. Luego
'al resto le sumamos 1, y obtenemos de
'la lista de letras, la que corresponda
'con ese número de NIF

Range("B18") = Mid(Lista_de_letras, (NIF Mod 23) + 1, 1)
End If
End Sub

¿Y si lo queremos a través de un bonito UserForm?. ...¡¡¡Joder, sí que pedís cosas!!!. Bueno, vale, aquí os dejo la otra opción, la de utilizar un UserForm. Para los que no lo sepan, aquí explico como crear un USerForm. Para ello, crearemos un UserForm como este (doble clic en la imagen, para verla más grande), al que llamaremos Letra_NIF:


Haremos clic en el botón del UserForm llamado "Calcular la letra", y pegaremos este código:

Private Sub CalcularLetra_Click()
On Error GoTo Fin
'Si el número del NIF está vacío
If NumeroNIF = Empty Then
NumeroNIF.SetFocus
MsgBox (Chr(13) + " Por favor, introduce el número del N.I.F. " _
+ Chr(13) + Chr(13)), vbOKOnly, " Datos incompletos"
End If
'Si el número del NIF no es numérico
If Not IsNumeric(NumeroNIF) Then
'que elimine la entrada
NumeroNIF = Empty
NumeroNIF.SetFocus
End If
'Si el número del NIF tiene separador de miles,
'lo envía a la Linea1

If NumeroNIF = Format(NumeroNIF, "#,##0") Then
GoTo Linea1
End If
'Si el formato es distinto del numérico
If NumeroNIF <> Format(NumeroNIF, "##0") Then
'que elimine las entrada
NumeroNIF = Empty
Texto2.Caption = Empty
Texto3.Caption = Empty
NumeroNIF.SetFocus
End If
Linea1:
'si el número del NIF es numérico
If IsNumeric(NumeroNIF) And NumeroNIF > 0 Then
'le da formato con punto de millar
NumeroNIF = Format(NumeroNIF, "##,##0")
'Tenemos una constante que contiene las
'posibles letras que puede tener un NIF

Lista_de_letras = "TRWAGMYFPDXBNJZSQVHLCKE"
'Cogemos el NIF, lo dividimos entre 23
'y nos quedamos con el resto. Luego
'al resto le sumamos 1, y obtenemos de
'la lista de letras, la que corresponda
'con ese número de NIF

Texto2.Caption = Mid(Lista_de_letras, (NumeroNIF Mod 23) + 1, 1)
'ponemos la etiqueta correspondiente
Texto3.Caption = NumeroNIF & "-" & Texto2.Caption
End If
Fin:
End Sub

Justo debajo de ese código, pondremos este otro:

Private Sub NumeroNIF_Enter()
On Error GoTo Fin
'eliminamos las entradas
NumeroNIF = Empty
Texto2.Caption = Empty
Texto3.Caption = Empty
Fin:
End Sub

Y este otro:

Private Sub NumeroNIF_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
On Error GoTo Fin
'eliminamos las entradas
NumeroNIF = Empty
Texto2.Caption = Empty
Texto3.Caption = Empty
Fin:
End Sub

Y este otro también:

Private Sub cerrar_Click()
On Error GoTo Fin
'Descarga el formulario de la memoria
Unload Me
Fin:
End Sub

Y ya para finalizar, solo nos bastará incluir este código en un módulo:

Sub calcular_letra_NIF()
On Error GoTo Fin
Letra_NIF.Show
Fin:
End Sub

Desde aquí podéis descargar el fichero de excel, con todo el código que os presento en este artículo.



6 comentarios:

ZOZRAM dijo...

Maestro, estás pesado!

Gracias por poner tu experiencia y conocimientos en éste blog.

Podrás ayudarme a insertar en una celda la información especifica de la pc y la hora que se modificó por primera vez este archivo de excel?.

Estoy haciendo un checador de tiempo y cada ususario debera abrir este archivo de excel en su procesador e insertar una clave. Pretendo recabar esta informacion en otro archivo de nuestra red interna.

Javier Marco dijo...

Gracias por tu comentario.

Prueba con este ejemplo: http://www.megaupload.com/es/?d=Z7NE0MPW

Salu2

Anónimo dijo...

Gracias por tu gran ayuda. Me gustaría saber si hay alguna forma de poner en una celda combinada, por ejemplo: bastidor de un vehículo (nºs y letras), con una separación específica entre ellas.
Gracias otra vez, eres bueno, muy bueno.

gonzalo dijo...

Hola. Muchas gracias por tu ayuda. Tengo una consulta para ti. Tengo en una hoja un listado con 50 filas y una columna para el nombre, otra para el primer apellido y otra para el segundo apellido. ¿Hay alguna forma de hacer que me genere otra hoja de manera que las columnas se ordenen aleatoriamente, resultando nombre totalmente diferentes?
Gracias, nuevamente.

Anónimo dijo...

En la Rep. Dominicana la letra del NIF O del DNI se calcula con número ejemplo
056-0002476-9 donde 056 es la serie o provincia del portador del NIF solo hay 167 serie en el país, 0002476 es el número del NIF y 9 es el numero de control, podría decirme como funciona este NIF en Excel. Y la forma de verificación exacta.

Javier Marco dijo...

¿Y en base a qué algoritmo, ecuación, o cálculo, se obtiene el número de control?.