Discussion:
Calcular dígito de control, IBAN.
(demasiado antiguo para responder)
v***@gmail.com
2013-11-02 00:39:35 UTC
Permalink
Hola a todos, tengo el siguiente problema, necesito hacer
una función que me calcule el código IBAN. No tendría
mayor problema si me funcionara la función MOD que me
Sacando de allí y acá puse en el código una función que daba el resto y funcionó. Este hilo es viejísimo pero si alguien lo lee (como yo) que le sirva.
Salud!


Public Function DigitoControl(ByVal NroCta As String) As String
' Esta función devolverá el Código IBAN de la cuenta, pero OJO!!!
' sólo sirve para ESPAÑA, ya q sólo tengo informaciónde ES=(E = 14, S= 28)
Dim IBAN As Variant
Dim DigControl As String
Dim Resto As Variant
Dim cociente As Double

On Error GoTo Errores

' Le paso 20 dígitos 0012 0345 0300 0006 7890
IBAN = NroCta

' Le añade a la cola 0012 0345 0300 0006 7890 142800
IBAN = IBAN & "142800"

' Aquí me peta, el error es: Desbordamiento...
cociente = CDec(IBAN) / 97

' Resto = IBAN - (Int(cociente) * 97)
' Resto = IBAN - ((cociente) * 97)

Resto = RestoDEC(CStr(IBAN), 97)

' Si todo ha ido bien, DigControl es 7
DigControl = CStr(98 - Resto)

' Si DigControl SÓLO es de un dígito, anteponer un 0 para que sea 07
If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl

' IBAN = ES + 07 + 0012 0345 0300 0006 7890
IBAN = "ES" & DigControl & NroCta

' La función devolverá: ES07 0012 0345 0300 0006 7890 (por supuesto sin espacios...)
DigitoControl = IBAN

Exit Function
Errores:
MsgBox Err.Description
Err.Clear

End Function

Public Function RestoDEC(cNumero As String, nDivisor As Long) As Long
Dim vDec As Variant

vDec = CDec(cNumero)
RestoDEC = vDec - Int(vDec / nDivisor) * nDivisor

''' o todo en una linea:
RestoDEC = CDec(cNumero) - Int(CDec(cNumero) / nDivisor) * nDivisor
End Function
b***@gmail.com
2013-11-14 12:29:31 UTC
Permalink
mi pequeña aportacion, esta probado y funciona:



Public Function DigitoControl(ByVal NroCta As String) As String

numeroiban$ = NroCta + "142800"

parte1$ = Mid$(numeroiban$, 1, 9)
parte2$ = Mid$(numeroiban$, 10, 7)
parte3$ = Mid$(numeroiban$, 17, 7)
parte4$ = Mid$(numeroiban$, 24, 6)

A = Val(parte1$) Mod 97
B = Val(Format(A) + parte2$) Mod 97
C = Val(Format(B) + parte3$) Mod 97
D = Val(Format(C) + parte4$) Mod 97

DigControl = Format(98 - D)

If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl

DigitoControl = "ES" & DigControl



Exit Function



Errores:
MsgBox Err.Description
Err.Clear

End Function
a***@gmail.com
2013-12-03 11:09:55 UTC
Permalink
Perfecto, el algoritmo funciona genial, muchas gracias a todos por compartirlo!
Post by v***@gmail.com
Public Function DigitoControl(ByVal NroCta As String) As String
numeroiban$ = NroCta + "142800"
parte1$ = Mid$(numeroiban$, 1, 9)
parte2$ = Mid$(numeroiban$, 10, 7)
parte3$ = Mid$(numeroiban$, 17, 7)
parte4$ = Mid$(numeroiban$, 24, 6)
A = Val(parte1$) Mod 97
B = Val(Format(A) + parte2$) Mod 97
C = Val(Format(B) + parte3$) Mod 97
D = Val(Format(C) + parte4$) Mod 97
DigControl = Format(98 - D)
If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl
DigitoControl = "ES" & DigControl
Exit Function
v***@urkide.org
2013-12-04 16:26:24 UTC
Permalink
Muchísimas gracias.

Grandísima aportación.
Post by v***@gmail.com
Public Function DigitoControl(ByVal NroCta As String) As String
numeroiban$ = NroCta + "142800"
parte1$ = Mid$(numeroiban$, 1, 9)
parte2$ = Mid$(numeroiban$, 10, 7)
parte3$ = Mid$(numeroiban$, 17, 7)
parte4$ = Mid$(numeroiban$, 24, 6)
A = Val(parte1$) Mod 97
B = Val(Format(A) + parte2$) Mod 97
C = Val(Format(B) + parte3$) Mod 97
D = Val(Format(C) + parte4$) Mod 97
DigControl = Format(98 - D)
If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl
DigitoControl = "ES" & DigControl
Exit Function
MsgBox Err.Description
Err.Clear
End Function
j***@gmail.com
2013-11-15 09:17:30 UTC
Permalink
Estaba desesperado buscando la forma de calcular el dichoso dígito de control!

Os lo habeis currao!

Muchas gracias por compartirlo!!!
o***@gmail.com
2013-12-04 12:28:36 UTC
Permalink
La correspondencia numérica de los códigos alfabéticos de país es de 10 para la A hasta 35 para la Z, por eso la E es 14 y la S 28.

Un saludo.
o***@gmail.com
2013-12-04 13:56:05 UTC
Permalink
¡Ojo! acabo de ver un algoritmo en http://code.google.com/p/checkdigits/wiki/CheckDigitSystems y en lo que se ha publicado faltaría algo:

Según esto, una vez obtenido el resto, habría que restarlo de 98 y del resultado volver a sacar el resto con 97. Ello afectaría a los valores 98 y 97 que pasarían a ser 1 y 0 respectivamente. El resto de los resultados no variarían.

Espero que os sirva.
j***@gmail.com
2013-12-17 11:14:32 UTC
Permalink
El viernes, 26 de abril de 2002 13:27:14 UTC+2, Javier Muñoz escribió:
Con una modificación para añadir por paises si os interesa un saludo.

Public Function DigitoControl(ByVal NroCta As String, Optional ByVal Pais As String = "ES") As String
Dim DigitoPais As String
'quitamos posibles caracteres en blanco
NroCta = Replace(NroCta, " ", "")
UCase (Pais)
'Calculamos por paises los numeros
For i = 1 To Len(Pais)
'averiguo el codigo ascii y le recto 55 para tener el número correcto.
DigitoPais = DigitoPais & Asc(Mid(Pais, i, 1)) - 55
Next i

'por si algun pais ocupa mas de dos caracteres por si acaso hago esto.
For i = Len(DigitoPais) To 5
DigitoPais = DigitoPais & "0"
Next i

numeroiban$ = NroCta + DigitoPais

parte1$ = Mid$(numeroiban$, 1, 9)
parte2$ = Mid$(numeroiban$, 10, 7)
parte3$ = Mid$(numeroiban$, 17, 7)
parte4$ = Mid$(numeroiban$, 24, 6)

A = Val(parte1$) Mod 97
B = Val(Format(A) + parte2$) Mod 97
C = Val(Format(B) + parte3$) Mod 97
D = Val(Format(C) + parte4$) Mod 97

DigControl = Format(98 - D)

If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl

DigitoControl = "ES" & DigControl

End Function
j***@gmail.com
2013-12-17 11:30:42 UTC
Permalink
Estas modificaciones son para poder poner los distintos paises. es

Public Function DigitoControl(ByVal NroCta As String, Optional ByVal Pais As String = "ES") As String
Dim DigitoPais As String
'quitamos posibles caracteres en blanco
NroCta = Replace(NroCta, " ", "")
Pais = UCase(Pais)
'Calculamos por paises los numeros
For i = 1 To Len(Pais)
'averiguo el codigo ascii y le recto 55 para tener el número correcto.
DigitoPais = DigitoPais & Asc(Mid(Pais, i, 1)) - 55
Next i

'por si algun pais ocupa mas de dos caracteres por si acaso hago esto.
For i = Len(DigitoPais) To 5
DigitoPais = DigitoPais & "0"
Next i

numeroiban$ = NroCta + DigitoPais

parte1$ = Mid$(numeroiban$, 1, 9)
parte2$ = Mid$(numeroiban$, 10, 7)
parte3$ = Mid$(numeroiban$, 17, 7)
parte4$ = Mid$(numeroiban$, 24, 6)

A = Val(parte1$) Mod 97
B = Val(Format(A) + parte2$) Mod 97
C = Val(Format(B) + parte3$) Mod 97
D = Val(Format(C) + parte4$) Mod 97

DigControl = Format(98 - D)

If Len(Trim(DigControl)) = 1 Then DigControl = "0" & DigControl

DigitoControl = Pais & DigControl

End Function
c***@gmail.com
2014-01-28 15:03:30 UTC
Permalink
No se me habría ocurrido nunca hacer una división manual, pero, ¿por qué divides los trozos exactamente en esos tamaños? ¿el último trozo no sería mid(x,24,3)?
m***@yahoo.com
2014-02-13 20:04:50 UTC
Permalink
Bueno, por si vale de algo esto aquí.
AD 101300 Andorra
AT 102900 Austria
BE 111400 Bélgica
CY 123400 Chipre
CZ 123500 República Checa
DK 132000 Dinamarca
EE 141400 Estonia
FI 151800 Finlandia
FR 152700 Francia
DE 131400 Alemania
GI 161800 Gibraltar
GR 162700 Grecia
HU 173000 Hungría
IS 182800 Islandia
IE 181400 Irlanda
IT 182900 Italia
LV 213100 Latvia
LT 212900 Lituania
LU 213000 Luxemburgo
NL 232100 Países Bajos
NO 232400 Noruega
PL 252100 Polonia
PT 252900 Portugal
SK 282000 República Eslovaca
SI 281800 Eslovenia
ES 142800 España
SE 281400 Suecia
CH 121700 Suiza
GB 161100 Reino Unido

Continúe leyendo en narkive:
Loading...