martes, 1 de abril de 2014

VBA: Obtener el IBAN de una cuenta corriente.

En el post del día veremos como replicar el algoritmo para conseguir el número IBAN de una cuenta corriente, en especial de una cuenta española.
Como sabemos desde el pasado 01-feb-2014 entró en vigor el espacio SEPA, y las transacciones bancarias se hacen empleando un nuevo código bancario que facilita el movimiento de dinero dentro de ese espacio SEPA.
Podemos leer algo más al respecto en nuestra amiga Wikipedia, o la explicación dada en este documento del Banco de España (ver).


En definitiva el I.B.A.N. o Código Internacional de Cuenta Bancaria es el número de identificación internacional de cuentas bancarias, que agiliza los pagos dentro de la Unión Europea. Toda cuenta bancaria tiene un I.B.A.N., pero éste no sustituye al Código Cuenta Cliente actual.
El I.B.A.N. consta como máximo de 34 caracteres contiguos teniendo en cada país una longitud fija.

En España está formado por 24 caracteres:

VBA: Obtener el IBAN de una cuenta corriente.


Presentación en distintos formatos:
- En formato electrónico debe mostrarse con los 24 caracteres seguidos, sin ninguna separación. (Ej.: ES7001280010120123456789)
- En formato papel debe seguir esta estructura: Incluir palabra I.B.A.N. en primer lugar. Y dividir los 24 caracteres en bloques de 4 separados por un espacio. El último grupo tendrá una longitud variable, según el país, que en España es de 4 caracteres (Ej.: IBAN ES70 0128 0010 1201 2345 6789)


A partir de esa breve explicación profundizaremos hacia donde realmente nos interesa... y es que generar esa nueva codificación de cuenta se realiza a partir de un algoritmo, que por supuesto es posible replicar desde Excel.

Incluiremos en un módulo de nuestro proyecto de VBA, dentro del Editor de VB la siguiente Function:

Function GeneradorIBAN(Pais As String, CCC As String) As String
'En el parametro Pais indicamos el código internacional del pais con 2 letras (ES para España)
'En el segundo parametro CCC señalamos el Codigo Cuenta Cliente (el número de cuenta)

Dim Letras As String, IBAN As String
Dim Dividendo As Integer, Resto As Integer

'Eliminamos los posibles espacios dados en la cuenta
CCC = Replace(Trim(CCC), " ", "")

'Calculamos el valor de las letras del País, quitamos y añadimos el valor al final
'serán E=14 y S=28 y acabado en dos ceros... ([CCC]142800)
'La equivalencia corresponde a A=10, B=11, C=12, ..., Y=34, Z=35
Letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
IBAN = CCC & CStr(InStr(1, Letras, Left(Pais, 1)) + 9) & CStr(InStr(1, Letras, Right(Pais, 1)) + 9) & "00"

'recorremos todos los 26 caracteres del número dado ([CCC]142800)
For i = 1 To Len(IBAN)
    Dividendo = Resto & Mid(IBAN, i, 1)
    Resto = Dividendo Mod 97
Next i

'devolvemos el IBAN generado a la hoja de cálculo
'compuesto por el texto 'IBAN', seguido del código de País informado, el Dígito Control del IBAN, y
'el CCC del inicio (que no cambia):
GeneradorIBAN = "IBAN " & Pais & Format((98 - Resto), "00") & CCC

End Function



Como observamos en el código anterior se replica la forma de cálculo del IBAN, puesto que convertimos en un número de 26 dígitos la estructura ESXX 0000 0000 00 0000000000, valor sobre el que operamos hasta conseguir un resto/residuo resultante de dividir ese valor entre 97.
Finalmente, a partir de la diferencia de 98 entre el resto anterior, componemos el Dígito control del IBAN.. y por ende el IBAN completo.


He verificado sobre bastantes cuentas esta función, y en todas resulta correcto.

Otra manera de llegar a este IBAN, sin emplear programación, es mediante el uso de funciones/fórmulas directamente en la Hoja de cálculo... pero aquí el problema viene de la limitación de operar en la hoja de cálculo por la precisión de Excel, ya que no admite números con más de 15 dígitos.. y nosotros deberemos trabajar con uno de 26!!!.
La solución es partir el número de 26 dígitos en tramos de 8 dígitos (8 + 8 + 8 + 2) y poder ir operando, siguiendo la misma lógica que la de la macro (dividir por 97 y aplicar al resto resultante la diferencia con 98.

La fórmula en cuestión para el CCC[142800] en la celda C2 es:
=DERECHA(0&98-RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(C2;1;8);97)&EXTRAE(C2;9;8);97)&EXTRAE(C2&142800;17;8);97)&EXTRAE(C2&142800;25;2);97);2)


Vemos que en C2 hemos compuesto manualmente el número sobre el que calcular, creado a partir del CCC seguido de 142800, que correspondía a las letras ES del país.
El Dígito Control del IBAN resulta, para el ejemplo, 98... con lo que finalmente en la celda E2 con un cancatenado:
=CONCATENAR(B2;D2;A2)
conseguimos el IBAN completo.

Comprobamos como el resultado coincide con nuestra función VBA 'GeneradorIBAN'.

No hay comentarios:

Publicar un comentario en la entrada