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:
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.
Gracias por tu comentario.
Prueba con este ejemplo: http://www.megaupload.com/es/?d=Z7NE0MPW
Salu2
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.
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.
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.
¿Y en base a qué algoritmo, ecuación, o cálculo, se obtiene el número de control?.
Publicar un comentario