Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Calcular dígito de control, IBAN.

7,916 views
Skip to first unread message

Javier Muñoz

unread,
Apr 26, 2002, 7:25:01 AM4/26/02
to
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
devuelve el RESTO de un operación pero no me lo da de
manera correcta porque estamos hablando de calcular una
cifra de 26 dígitos enteros, paradójicamente la
calculadore de windows sí lo hace... bien, intento
hacerla "a machete" y tampoco!!! porque cuando intento
calcular el RESTO no consigo coger la parte entera de
1240670412371833918997,9381443 os paso el código que tengo
hecho hasta ahora...


Private 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ón
de ES=(E = 14, S= 28)
Dim IBAN As Variant
Dim DigControl As String
Dim Resto As Variant
Dim cociente As Variant

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 - ((cociente) * 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

Errores:
MsgBox "Se ha producido un error en el módulo de
cálculo del IBAN...", vbInformation + vbOKOnly, Caption
Err.Clear

End Function

Pagaag

unread,
Apr 26, 2002, 9:33:47 AM4/26/02
to
No lo consigo, Javier.
Lo he intentado de la siguiente forma:
Dado que MOD da error de desbordamiento, cojo la Formula

RESTO=DIVIDENDO-DIVISOR*COCIENTE

Utilizo operador \ que devuelve entero, despreciando el resto(No confundas
con /)
Cociente=Val(IBAN)\97
Resto = Val(IBAN) - 97 * Cociente

Bueno, pues da error de desbordamiento en Cociente=Val(IBAN)\97
Ya puedes declarar lo que quieras a cociente, que da el error.-
Me rindo.

Francisco García Aguado
"Javier Muñoz" <rpt27QU...@hotmail.com> escribió en el mensaje
news:29e301c1ed15$01278d70$39ef2ecf@TKMSFTNGXA08...

Javier Muñoz

unread,
Apr 26, 2002, 9:35:52 AM4/26/02
to
Muchísimas gracias por tu tiempo amigo ;-)

Ya, estoy pensando en coger el resultado y aplicarle la función InStr y
rechazar todo lo que esté a la derecha de la coma.... ya te/os contaré...

--


Un saludo,

Javier Muñoz


"Pagaag" <pagaagQ...@hotmail.com> escribió en el mensaje
news:OU0gXaS7BHA.2268@tkmsftngp04...

Eva Etxebeste

unread,
Apr 26, 2002, 9:56:59 AM4/26/02
to
Hola Javier

Será San Viernes, pero a mí me ha salido 07 :-0

A ver, he cogido la función que has enviado y he cambiado

Resto = IBAN - ((cociente) * 97)

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

Porque tal y como lo tenías tú, el resto era siempre 0

Será el chupito que me he tomao? Un saludo

Eva.


Javier Muñoz <rpt27QU...@Hotmail.com> escribió en el mensaje de noticias
uAO6DdS7BHA.1624@tkmsftngp04...

Pagaag

unread,
Apr 26, 2002, 10:16:14 AM4/26/02
to
Joer, pues si es por culpa del chupito, esta tarde me compro una de Pacharán
y me pongo ciego.
Yo lo que no entiendo es como:
Cociente=Val(IBAN)/97 funciona y
Cociente=Val(IBAN)\97 da error de desbordamiento.
Teoricamente el operador / se debería 'zampar', comer, destruir el resto,
pues para eso divide con decimales formando un periodo ^3.
Sin embargo \ divide solo hasta que tenga que sacar decimales, por ejemplo
100\3=33 y deja un resto de 3
100/3= 33,3333333333333333333333333333333333333333333333

Lo dicho, me bajo a por el Pacharan

Francisco García Aguado
"Eva Etxebeste" <eetxe...@hotmail.com> escribió en el mensaje
news:#CZqEpS7BHA.2216@tkmsftngp03...

Eva Etxebeste

unread,
Apr 26, 2002, 10:38:42 AM4/26/02
to
Era Ballantine's :(

Copioteo de la ayuda (operador \):
La sintaxis del operador \ consta de las siguientes partes:

Parte Descripción
resultado Requerido; cualquier variable numérica.
número1 Requerido; cualquier expresión numérica.
número2 Requerido; cualquier expresión numérica.

Comentarios
Antes de efectuar la división se redondean las expresiones numéricas para
convertirlas en expresiones tipo Byte, Integer o Long. MUY IMPORTANTE ESTO

También de la ayuda:
Las variables Long (enteros largos) se almacenan como números con signo de
32 bits (4 bytes) con un valor comprendido entre - 2.147.483.648 y
2.147.483.647

Y claro, convertir 1240670412371833918997,9381443 a Long no le resulta
sencillo, ni con Ballantine's :)

Pagaag <pagaagQ...@hotmail.com> escribió en el mensaje de noticias
u9PnFyS7BHA.2128@tkmsftngp03...

Pagaag

unread,
Apr 26, 2002, 10:54:18 AM4/26/02
to
Pues que bien...¿Y por que es tan pijo el Access o el VB que antes de
dividir con el operador \, convierte los operandos a Long y la mare que lo
pario?
¿Porque no hace eso mismo con / ?
¿Es mas guapo / que \ ?
¿Ganas de joer?
¿Por que soy tan corto que no me reviso la ayuda del operador \ antes de
decir ninguna parida mas?

Francisco García Aguado
"Eva Etxebeste" <eetxe...@hotmail.com> escribió en el mensaje

news:uLf8YAT7BHA.2412@tkmsftngp04...

Javier Muñoz

unread,
Apr 26, 2002, 11:02:51 AM4/26/02
to
Ok, acabo de leeros... gracias por vuestro tiempo, voy a
probar, retoco y si funciona os la paso.... jajaajajj

Javier,
>-----Mensaje original-----

>> > MsgBox "Se ha producido unÍ{ wÀ "éu8¤^_8O5|
ì error en el módulo de


>> > cálculo del IBAN...", vbInformation + vbOKOnly,
Caption
>> > Err.Clear
>> >
>> > End Function
>> >
>> >
>> >
>>
>>
>
>

>.
>

Javier Muñoz

unread,
Apr 26, 2002, 11:14:05 AM4/26/02
to
Hola Eva, ya lo probé... y... me sigue dando 0, no
modificaste nada mas???

Javier,
>-----Mensaje original-----

>> > MsgBox "Se ha producido unÍ{ wÀ ù "3h!Ü´ !
$'ö ì error en el módulo de


>> > cálculo del IBAN...", vbInformation + vbOKOnly,
Caption
>> > Err.Clear
>> >
>> > End Function
>> >
>> >
>> >
>>
>>
>
>

>.
>

Pagaag

unread,
Apr 26, 2002, 11:29:25 AM4/26/02
to
Revisa Javier, que a mi, despues de la instruccion

DigControl = CStr(98 - Resto)
me da 7, lo que implica que resto da 91 ¿Es asi?
Es decir DigControl = 7
que es lo que querias.

Francisco García Aguado
"Javier Muñoz" <rpt27QU...@hotmail.com> escribió en el mensaje

news:2ddd01c1ed35$012f4810$3aef2ecf@TKMSFTNGXA09...

Eva Etxebeste

unread,
Apr 26, 2002, 11:44:39 AM4/26/02
to

Siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii, también hago esto:
IBAN = Replace(NroCta, " ", "")

Justo al principio, para quitar los espacios en blanco de la cuenta

Javier Muñoz <rpt27QU...@hotmail.com> escribió en el mensaje de noticias
2ddd01c1ed35$012f4810$3aef2ecf@TKMSFTNGXA09...

Javier Muñoz

unread,
Apr 26, 2002, 11:49:11 AM4/26/02
to
Ok, Francisco, gracias por tu tiempo, he requeterevisado y
corrido una y otra vez LA MISMA FUNCION y SÓLO he
modificado la línea que ha comentado Eva y Resto vale 0
(cuando debería de ser efectvamente 91) .... seguro que no
se ha modificado otra cosa????

Javier,
>-----Mensaje original-----

>>> > ' Aquí me peta, el error es: DesbordamiÍ
{ wÀ £ \&l!ì o ¬ï
> ì[ ento...

victor.pe...@gmail.com

unread,
Nov 1, 2013, 8:39:35 PM11/1/13
to
El viernes, 26 de abril de 2002 13:27:14 UTC+2, Javier Muñoz escribió:
> 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

blu...@gmail.com

unread,
Nov 14, 2013, 7:29:31 AM11/14/13
to

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

jab...@gmail.com

unread,
Nov 15, 2013, 4:17:30 AM11/15/13
to
Estaba desesperado buscando la forma de calcular el dichoso dígito de control!

Os lo habeis currao!

Muchas gracias por compartirlo!!!

anton...@gmail.com

unread,
Dec 3, 2013, 6:09:55 AM12/3/13
to
Perfecto, el algoritmo funciona genial, muchas gracias a todos por compartirlo!

olazabal.i...@gmail.com

unread,
Dec 4, 2013, 7:28:36 AM12/4/13
to
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.

olazabal.i...@gmail.com

unread,
Dec 4, 2013, 8:56:05 AM12/4/13
to
¡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.

vlek...@urkide.org

unread,
Dec 4, 2013, 11:26:24 AM12/4/13
to
Muchísimas gracias.

Grandísima aportación.

El jueves, 14 de noviembre de 2013 13:29:31 UTC+1, blu...@gmail.com escribió:
Message has been deleted

jmve...@gmail.com

unread,
Dec 17, 2013, 6:30:42 AM12/17/13
to
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

csan...@gmail.com

unread,
Jan 28, 2014, 10:03:30 AM1/28/14
to
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)?

mima...@yahoo.com

unread,
Feb 13, 2014, 3:04:50 PM2/13/14
to
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
0 new messages