Attribute VB_Name = "IBAN"
Option Compare Database
Option Explicit
' IBAN - ProInf.net 2014-01-16
'
' Es una estándar de homogeneización bancaria,
' creada por el Comité Europeo de Estándares Bancarios (ECSB).
' Está regulado en las normas ISO 13616 y EBS204.
' Su formato puede variar teniendo un máximo de 34 caracteres,
' pudiendo ser tanto números como letras.
' En España, está formado por 24 caracteres.
'
' Su composición es la siguiente:
' - Primeros dos dígitos: código del país según la norma ISO 3166-1
' - 2 Dígitos de control, calculados según la norma ISO 13616 (Véase tabla anexa)
' - BBAN, es el número de cuenta bancaria básica. En España, se corresponde con el CCC (Código Cuenta Cliente).
'
' Ejemplos de uso:
' =ConvertirIBAN("1234-5678-06-1234567890") --> "ES68 1234 5678 0612 3456 7890"
' =CalcularIBAN("1234-5678-06-1234567890") --> "ES6812345678061234567890"
' =CalcularCCC("1234-5678-??-1234567890") --> "12345678061234567890"
' =ValidarIBAN("ES68 1234 5678 0612 3456 7890") --> True
' =FormatearCCC("12345678061234567890") --> "1234-5678-06-1234567890"
' =FormatearIBAN("ES6812345678061234567890") --> "ES68 1234 5678 0612 3456 7890"
' =ValidarCCC("1234-5678-??-1234567890") --> True
'
' Referencias:
' http://queaprendemoshoy.com/como-se-interpretan-los-digitos-de-ccc-y-el-iban/
' http://www.integrasistemas.es/blog/general/calculo-del-iban/
' http://www.lawebdelprogramador.com/foros/Visual_Basic/1409866-Calculo_IBAN.html#i1409890
' http://es.ibancalculator.com/bic_und_iban.html
' http://www.cnb.cz/miranda2/export/sites/www.cnb.cz/cs/platebni_styk/iban/download/EBS204.pdf
Private Const ESPACIO = " "
Private Const GUION = "-"
'El parámetro numero puede ser un CCC o un IBAN
'Si es un CCC retorna el IBAN correspondiente
'Si es un IBAN lo formatea
'Avisa si es un CCC incorrecto o un IBAN incorrecto
'
'Ejemplo1: ConvertirIBAN("12345") --> "Error: No es IBAN ni CCC"
'Ejemplo2: ConvertirIBAN("ES0012345678061234567890") --> "Error: IBAN incorrecto"
'Ejemplo3: ConvertirIBAN("ES5212345678001234567890") --> "Error: CCC incorrecto"
'Ejemplo4: ConvertirIBAN("ES6812345678061234567890") --> "ES68 1234 5678 0612 3456 7890"
'Ejemplo5: ConvertirIBAN("1234-5678-06-1234567890") --> "ES68 1234 5678 0612 3456 7890"
Public Function ConvertirIBAN(numero As Variant, Optional pais As String = "es") As String
ConvertirIBAN = ""
If IsNull(numero) Then Exit Function
Dim iban As String
Dim ccc As String
numero = Limpiar(numero)
iban = Right(numero, 24)
ccc = Right(numero, 20)
If Len(iban) <> 24 And Len(ccc) <> 20 Then
ConvertirIBAN = "Error: No es IBAN ni CCC"
ElseIf Len(iban) = 24 And Not ValidarIBAN(iban) Then
ConvertirIBAN = "Error: IBAN incorrecto"
ElseIf Not ValidarCCC(ccc) Then
ConvertirIBAN = "Error: CCC incorrecto"
ElseIf Len(iban) = 24 Then
ConvertirIBAN = FormatearIBAN(iban)
Else
ConvertirIBAN = FormatearIBAN(CalcularIBAN(ccc, pais))
End If
End Function
'Ejemplo: Limpiar("IBAN1234 5678-90") --> "1234567890"
Private Function Limpiar(numero As Variant) As String
numero = Replace(numero, "IBAN", "")
numero = Replace(numero, ESPACIO, "")
numero = Replace(numero, GUION, "")
Limpiar = numero
End Function
'Cómo se calcula los dígitos de control del IBAN
' a) Se añade al final de la BBAN, el código del país según la norma ISO 3166-1 y dos ceros.
' b) Si en el BBAN hay letras, convierte estas letras en números del 10 al 35, siguiendo el orden del abecedario; A=10 y Z=35.
' c) Divide el número por 97, y quédate con el resto.
' d) Réstale a 98 el resto que te quede
' e) Ya tenemos los dígitos de control, si la diferencia es menor a 10, añade un 0 a la izquierda.
'
'Ejemplo: CalcularIBAN("1234-5678-06-1234567890", "es") --> "ES6812345678061234567890"
Public Function CalcularIBAN(ccc As Variant, Optional pais As String = "es") As String
CalcularIBAN = ""
If IsNull(ccc) Then Exit Function
Dim cifras As String
Dim resto As Integer
ccc = Limpiar(ccc)
pais = UCase(Left(pais & "ZZ", 2))
cifras = ccc & ValorPais(pais) & "00"
resto = Modulo97(cifras)
CalcularIBAN = pais & Format((98 - resto), "00") & ccc
End Function
'Ejemplo1: ValidarIBAN("ES00 1234 5678 0612 3456 7890") --> False
'Ejemplo2: ValidarIBAN("ES68 1234 5678 0612 3456 7890") --> True
Public Function ValidarIBAN(iban As Variant) As Boolean
ValidarIBAN = False
If IsNull(iban) Then Exit Function
Dim pais As String
Dim dc As String
Dim cifras As String
Dim resto As Integer
iban = Limpiar(iban)
pais = Mid(iban, 1, 2)
dc = Mid(iban, 3, 2)
cifras = Mid(iban, 5) & ValorPais(pais) & dc
resto = Modulo97(cifras)
ValidarIBAN = IIf(resto = 1, True, False)
End Function
'Ejemplo: Modulo97("12345678061234567890142800") --> 30
Private Function Modulo97(cifras As Variant) As Integer
Dim dividendo As Integer
Dim resto As Integer
Dim indice As Integer
For indice = 1 To Len(cifras)
dividendo = resto & Mid(cifras, indice, 1)
resto = dividendo Mod 97
Next
Modulo97 = resto
End Function
'Ejemplo: ValorPais("es") --> "1428"
Private Function ValorPais(pais As String) As String
ValorPais = ValorLetra(Left(pais, 1)) & ValorLetra(Right(pais, 1))
End Function
Private Function ValorLetra(digito As String) As String
Const LETRAS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim posicion As Integer: posicion = InStr(LETRAS, digito)
ValorLetra = CStr(posicion - 1) 'A=10, B=11, ... Z=35
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Ejemplo: ValidarCCC("1234-5678-??-1234567890") --> False
Public Function ValidarCCC(ccc As Variant) As Boolean
ValidarCCC = False
If IsNull(ccc) Then Exit Function
ccc = Limpiar(ccc)
Dim items As Variant: items = Split(FormatearCCC(ccc, ESPACIO), ESPACIO)
Dim dc As String: dc = Modulo11("00" & items(0) & items(1)) & Modulo11(items(3))
ValidarCCC = IIf(dc = items(2), True, False)
End Function
'Ejemplo: CalcularCCC("1234-5678-??-1234567890") --> "12345678061234567890"
Public Function CalcularCCC(ccc As Variant)
CalcularCCC = ccc
If IsNull(ccc) Then Exit Function
ccc = Limpiar(ccc)
CalcularCCC = Mid(ccc, 1, 8) & CalcularDC(ccc) & Mid(ccc, 11, 10)
End Function
'Ejemplo: CalcularDC("1234-5678-??-1234567890") --> "06"
Public Function CalcularDC(ccc As Variant) As String
CalcularDC = "--"
If IsNull(ccc) Then Exit Function
ccc = Limpiar(ccc)
Dim items As Variant: items = Split(FormatearCCC(ccc, ESPACIO), ESPACIO)
CalcularDC = Modulo11(items(0) & items(1)) & Modulo11(items(3))
End Function
'Ejemplos:
' Modulo11("12345678") --> "0"
' Modulo11("1234567890") --> "6"
Private Function Modulo11(cifras As Variant) As String
Modulo11 = "-"
If IsNull(cifras) Then Exit Function
Dim modulos As Variant: modulos = Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6) '(2^index)%11
Dim suma As Integer: suma = 0
Dim indice As Integer
Dim control As Integer
cifras = String(10 - Len(cifras), "0") & cifras 'Rellenar con ceros a la izquierda
For indice = 1 To Len(cifras)
suma = suma + CInt(Mid(cifras, indice, 1)) * modulos(indice - 1)
Next
control = suma Mod 11
Modulo11 = IIf(control < 2, control, 11 - control)
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Ejemplo: FormatearCCC("12345678061234567890") --> "1234-5678-06-1234567890"
Public Function FormatearCCC(ccc As Variant, Optional separador = GUION) As String
FormatearCCC = ""
If IsNull(ccc) Then Exit Function
ccc = Limpiar(ccc)
FormatearCCC = Mid(ccc, 1, 4) & separador & Mid(ccc, 5, 4) & _
separador & Mid(ccc, 9, 2) & separador & Mid(ccc, 11, 10)
End Function
'Ejemplo: FormatearIBAN("ES6812345678061234567890") --> "ES68 1234 5678 0612 3456 7890"
Public Function FormatearIBAN(iban As Variant, Optional separador = ESPACIO) As String
FormatearIBAN = ""
If IsNull(iban) Then Exit Function
iban = Limpiar(iban)
FormatearIBAN = Mid(iban, 1, 4) & separador & Mid(iban, 5, 4) & _
separador & Mid(iban, 9, 4) & separador & Mid(iban, 13, 4) & _
separador & Mid(iban, 17, 4) & separador & Mid(iban, 21, 4)
End Function
Comentarios sobre la versión: Versión 1.0 (1)