Access - Calcular letre NIF/NIE

   
Vista:

Calcular letre NIF/NIE

Publicado por Conrrad (77 intervenciones) el 01/11/2010 19:50:59
Estimados amigos,
Ando buscando un código que me compruebe la letra del NIF o NIE. Actualmente estoy usando un código de hace unos años pero con los NIE nuevos que empiezan por la Y no me calcula bien la letra final.

Por los foros no encuentro un código fiable y por la red me encontré este que si que tiene en cuenta los NIE nuevos pero está escrito para VisualBasic.Net y no consigo adaptarlo a VBA.

Imports System.Text.RegularExpressions

Public Function GetDcNif(ByVal nif As String) As Char

'*******************************************************************
' Nombre: GetDcNif
' 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.
'
'*******************************************************************

' Pasamos el NIF a mayúscula a la vez que eliminamos los
' espacios en blanco al comienzo y al final de la cadena.
'
nif = nif.Trim().ToUpper()

' El NIF está formado de uno a nueve números seguido
' de una letra.
'
' El NIF de otros colectivos de personas físicas, está
' formato por una letra (K, L, M), seguido de 7 números
' y de una letra final.
'
' El NIE está formado de una letra inicial (X, Y, Z),
' seguido de 7 números y de una letra final.
'
' En el patrón de la expresión regular, defino cuatro grupos en el
' siguiente orden:
'
' 1º) 1 a 8 dígitos.
' 2º) 1 a 8 dígitos + 1 letra.
' 3º) 1 letra + 1 a 7 dígitos
' 4º) 1 letra + 1 a 7 dígitos + 1 letra.
'
Try
Dim re As New Regex( _
"(^\d{1,8}$)|(^\d{1,8}[A-Z]$)|(^[K-MX-Z]\d{1,7}$)|(^[K-MX-Z]\d{1,7}[A-Z]$)", _
RegexOptions.IgnoreCase)

If (Not (re.IsMatch(nif))) Then Return Nothing

' Nos quedamos únicamente con los números del NIF, y
' los formateamos con ceros a la izquierda si su
' longitud es inferior a siete caracteres.
'
re = New Regex("(\d{1,8})")

Dim numeros As String = re.Match(nif).Value.PadLeft(7, "0"c)

' Primer carácter del NIF.
'
Dim firstChar As Char = nif.Chars(0)

' Si procede, reemplazamos la letra del NIE
' por el peso que le corresponde.
'
If (firstChar = "X"c) Then
numeros = "0" & numeros

ElseIf (firstChar = "Y"c) Then
numeros = "1" & numeros

ElseIf (firstChar = "Z"c) Then
numeros = "2" & numeros

End If

' 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
'
Dim dni As Integer = CInt(numeros)

' 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.
'
' Obtenemos el resto de la división.
'
Dim r As Integer = dni Mod 23

' Obtenemos el dígito de control del NIF
'
Dim dc As Char = CChar("TRWAGMYFPDXBNJZSQVHLCKE".Substring(r, 1))

Return dc

Catch
' Cualquier excepción producida, devolverá el valor Nothing.
'
Return Nothing

End Try

End Function

En enlace de este código es: http://www.mvp-access.es/softjaen/vbnet/funciones/dc/sjvbnetfun03.htm

¿Me podéis echa una mano?
Gracias por adelantado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Calcular letre NIF/NIE

Publicado por 2pl (461 intervenciones) el 02/11/2010 14:17:49
Por lo que he leido, se utiliza el mismo algoritmo que para el NIF pero cambiando la letra de comiezo X por 0, Y por 1 y Z por 2
Ya me dirás.... saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular letre NIF/NIE

Publicado por Conrrad (77 intervenciones) el 02/11/2010 19:24:59
Al final encontramos la solución. Una vez adaptado el código y revisado os lo pongo completo. Me gustaría citar las fuentes del mismo pero como ha sido todo un poco de aquí y un poco de allí no puedo, excepto la última aportación de Monyi en los foros del Búho: http://www.mvp-access.com/foro/forum_posts.asp?TID=66092&PID=391965#391965


En el evento, después de actualizar del campo que contiene el DNI: Me.txtDNI = CalculaDNI(Me.txtDNI)

Todo este código lo pongo en un módulo puesto que lo utilizo desde otros formularios.


'***********************************************
' 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)
'DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

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)
'DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

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
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular letre NIF/NIE

Publicado por JAVIER (1 intervención) el 14/05/2013 21:21:15
La función letra_dni funciona perfectamente. Es lo que estaba buscando pues, aunque tenía una función que me funcionaba con los NIF, no encontraba la solución para comprobar los NIE correctos.

Un trabajo estupendo, gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Calcular letre NIF/NIE

Publicado por Edu (1 intervención) el 12/02/2014 17:17:31
Hola. He copiado el codigo sobre un modulo de Access 2007 y al compilarlo me salen errores. La aplicación parece muy completa y me interesa que funcione en Access. ¿ Alguna sugerencia ?. (12/02/2013)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar