martes, 29 de abril de 2014

VBA: Variables Dim, Public, Private y Static

En definitiva hablaremos hoy del ámbito de las variables, es decir, dónde aplican nuestras variables una vez definidas. Es importante saber que el ámbito de una variable se determina en el momento en que se declara la variable.
En VBA para Excel, los tres ámbitos existentes para las variables son: Públicas, Módulo y Procedimiento.


Comenzamos por el más habitual el ámbito de Procedimiento, es decir, la variable así definida se reconoce únicamente dentro del procedimiento en el que la declaramos.
Podremos declarar una variable local de procedimiento con una instrucción Dim o Static.

Cuando definimos o declaramos una variable local con la instrucción Dim, la variable permanece en memoria sólo mientras se ejecuta el procedimiento en el que la hemos declarado, y por tanto, normalmente, cuando termina el procedimiento de ejecución, no se conservan los valores de las variables locales del procedimiento y se libera la memoria asignada a esas variables. La próxima vez que se ejecute el procedimiento, se reinicializarán todas las variables locales declaradas.

Un ejemplo de variable local DIM:

En un módulo cualquiera de nuestro proyecto de VBA insertamos los siguientes procedimientos:

Sub Local1()
   Dim X As Integer 'variable local dentro del Procedimiento
   X = 1313
   MsgBox "X tiene un valor de " & X
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Local2()
   Dim X As String 'variable local dentro del Procedimiento
   X = "Afirmativo"
   MsgBox "La respuesta ha sido " & X
End Sub


Muy importante!!: Cada variable X es independiente del otro procedimiento, sólo se reconoce la variable dentro de su propio procedimiento respectivo (Local1 ó Local2).

La otra forma de definir una variable local de Procedimiento es declarar la variable como Static. Una variable local declarada con la instrucción Static sigue existiendo todo el tiempo que se ejecuta en Visual Basic. La variable se restablece cuando se produzca cualquiera de las siguientes acciones:
- La macro genera un error de tiempo de ejecución no interceptado.
- VBA se detiene.
- Salimos de Excel.
- Cambiamos el módulo.

Un ejemplo de variable local STATIC:

En un módulo cualquiera de nuestro proyecto de VBA insertamos los siguientes procedimientos:

Sub Estatica()
   Static Acum 'variable local que retiene su valor
   'tras finalizar el procedimiento...
   num = Application.InputBox(prompt:="Introduce un valor: ", Type:=1)
   Acum = Acum + num
   MsgBox "La variable acumulada (estática) nos devuelve un valor " & Acum
End Sub


Muy Importante!!: En nuestro procedimiento Estatica, la variable 'Acum' conserva su valor cada vez que se ejecuta. Por ejemplo, la primera vez que se ejecuta el módulo, introducimos en el cuadro el valor 10, el MsgBox mostrará el valor 10 (lógicamente)... si la siguiente vez que se ejecuta el módulo, introducimos el valor 20, el MsgBox mostrará el valor de 30 (10+20...) !!.

El siguiente ámbito interesante para conocer es el de Módulo.
Una variable que es reconocida en todos los procedimientos en un módulo se denomina una variable de Módulo. Una variable de nivel de módulo está disponible para todos los procedimientos de ese mismo módulo, pero no está disponible para los procedimientos de otros módulos.
Mientras VBA se ejecuta, hasta que se modifique el módulo en el que se declara, una variable de módulo sigue existiendo.
Se pueden declarar variables de ámbito de módulo con una instrucción Dim o Private en la parte superior del módulo, encima de la primera definición de procedimiento.

En el ámbito de módulo, no hay ninguna diferencia entre Dim y Private... pero debemos tener en cuenta que no se pueden declarar variables de ámbito de módulo dentro de un Procedimiento.
En general, una recomendación, si utilizamos Private en lugar de Dim para las variables de ámbito módulo, el código será más fácil de leer esto es, si utilizamos Dim solamente para variables locales de procedimiento y Private para las variables de módulo, el ámbito de una variable determinada será más claro.
Un ejemplo de variable de módulo:

En un módulo cualquiera de nuestro proyecto de VBA insertamos los siguientes procedimientos:

'Variables A y B de ámbito Módulo
'que sirven para todos los procedimientos de este módulo
Dim A As Integer
Private B As Integer

Sub Procedimiento1()
    A = 100
    B = A + 1
End Sub

Sub Procedimiento2()
    MsgBox "A es igual a " & A
    MsgBox "B es igual a " & B
End Sub

Sub Procedimiento3()
     Dim C As Integer    'Variable local de procedimiento
     C = A + B
     MsgBox "C es igual a" & C
End Sub

Sub Procedimiento4()
     MsgBox A     'Este MsgBox muestra el valor de A
     MsgBox B     'Este MsgBox muestra el valor de B
     MsgBox C     'Este MsgBox NO muestra nada, porque C la habíamos definido como variable local de procedimiento
End Sub


Muy importante!!!: En el ejemplo siguiente, hemos comenzado declarando dos variables A y B, de ámbito de módulo (antes de todos los procedimientos!!), por tanto estarán disponibles para cualquiera de los procedimientos de dicho módulo. La tercera variable C, que se declara en la macro de Procedimienti3, es una variable local y sólo está disponible para ese procedimiento.

Tengamos en cuenta que en Procedimiento4, cuando la macro intenta utilizar la variable C, el tercer MagBox está vacíoporque C es una variable local y no está disponible en Procedimiento4, mientras que las variables A y B si lo están al tener como ámbito todo el módulo.


Finalizaremos con las variables Públicas (recordemos que eran tres los ámbitos).
Las variables públicas - Public - tienen el ámbito más amplio de todas las variables. Una variable pública es reconocida por todos los módulos del libro de trabajo activo.
Una variable pública se declara igual que una variable de ámbito de módulo, es decir, en la parte superior del módulo, encima de la primera definición de procedimiento. NO se puede declarar una variable pública dentro de un procedimiento. Siempre se declara una variable pública con una instrucción Public (podremos declarar una variable pública en cualquier módulo).

Atención por que es posible que varios módulos tengan variables públicas con el mismo nombre !!!, por tanto, para evitar confusiones y posibles errores, una buena práctica sería utilizar nombres únicos.
Un ejemplo de variable PUBLIC:

En un módulo cualquiera de nuestro proyecto de VBA insertamos el siguiente procedimiento:

Public precio As Double  'variables públicas válidas para todo el libro
Public uds As Integer
Public costes As Integer
Private factor As Double

Sub CDSales()
precio = 1.313
uds = 1000
costes = 1
factor = 1.1

MsgBox "El resultado es " & uds * (precios - (costes * factor))
End Sub


Importante!!: Las tres variables Public sirven para cualquier módulo dentro del libro, mientras que la cuarta (Pirvate factor) únicamente serviría dentro de este módulo.

miércoles, 23 de abril de 2014

Curso Excel Financiero Online.

Porque necesitas Excel, porque una buena base te permitirá avanzar en tu trabajo.
Aprende con los mejores: Edición de Cursos de Excel y Macros online con tutor personal de Mayo de 2014.


Los cursos de Excel y Macros abiertos para este mes de Mayo son:

Curso Excel Financiero

(ver más)


Curso Excel Avanzado para versiones 2007/2010

(ver más)

Curso Excel Nivel Medio

(ver más)


Curso Tablas dinámicas en Excel

(ver más)

Curso preparación MOS Excel 2010 (Examen 77-882)

(ver más)


Curso Macros Iniciación

(ver más)

Curso Macros Medio

(ver más)


Esta nueva edición de Cursos de Excel y macros en modalidad elearning (online) comienzan el día 1 de mayo de 2014; y la matrícula estará abierta hasta el día 10.

Excelforo: con la confianza de siempre....estás a tiempo!!

También formación Excel a empresas. Explota los recursos a tu alcance (ver más).


Informarte sin compromiso en cursos@excelforo.com o directamente en www.excelforo.com.

lunes, 21 de abril de 2014

¿Qué día es el lunes de la semana?

La idea del día es clara, cómo conseguir saber qué día del mes corresponde al lunes de cualquier semana dada una fecha cualquiera... Es decir, a partir de un dia del año cualquiera saber cuál es el lunes de dicha semana.
Partamos de la imagen siguiente para llegar a construir nuestro modelo:

¿Qué día es el lunes de la semana?


Como vemos la fórmula buscada es:
=FECHA(AÑO($A$2);1;1) - RESIDUO(DIASEM(FECHA(AÑO($A$2);1;7);2); 7) + (NUM.DE.SEMANA($A$2)-1)*7

La cual explicamos por partes a continuación.


Son tres partes.
la primera nos devuelve el primer día del año de la Fecha de estudio:
FECHA(AÑO($A$2);1;1)

La segunda algo más compleja nos ajusta la operación conociendo en qué día de la semana finaliza la primera semana natural del año, esto es, el día 7 de enero:
RESIDUO(DIASEM(FECHA(AÑO($A$2);1;7);2); 7)
Fijémosnos que el resto del cociente de un número entero entre 1 y 7 dividido por 7 nos dará un valor de 1,2,3,4,5,6 ó 0; así que nuestro primer ajuste nos devuelve la fecha del Lunes que corresponda a la primera semana del año; para nuestro ejemplo del 2014, el lunes de la primera semana del año corresponde al 30/12/2013...

El tercer paso, y último ajuste de la fórmula
(NUM.DE.SEMANA($A$2)-1)*7
sirve para, una vez conocido el 'primer lunes', al sumarle tantos días como semanas menos una correspondan a la fecha de estudio, lógicamente llegaremos al lunes de la semana buscado.

¿Qué día es el lunes de la semana?

jueves, 17 de abril de 2014

Formato de celda: Oculta.

El tema de hoy diría que no es algo muy habitual en nuestras hojas de trabajo, pero a veces conviene recordar funcionalidades de Excel.
Hablaré de la opción de Ocultar celda dentro de los formatos de celdas.

Accederemos a esta opción desde Formato de celda > pestaña Proteger > opción Oculta

Formato de celda: Oculta.


Recordar que esta opción sólo será hábil cuando nuestra hoja de trabajo esté protegida (al igual que Bloquear celda).


Veamos el efecto de ésta sobre el siguiente ejemplo. En el rango F3:G5 he incluido una serie de fórmulas, que resumen la información del rango A1:C10.

Con la configuración normal, al seleccionar cualquier celda con valores o fórmulas, podremos visualizarlas en la barra de fórmula:

Formato de celda: Oculta.


Se observa claramente como aparece visible en la Barra de fórmulas la función insertada en dicha celda.

Ahora cambiaremos y marcaremos la opción Ocultar, tras seleccionar el rango F3:G5, y a continuación Protegeremos la hoja (desde la ficha Revisar > grupo Cambios > botón Proteger hoja).
Si nos situamos encima de alguna de esas celdas del rango F3:G3 y nos fijamos en nuestra Barra de fórmulas comprobaremos la diferencia... no vemos nada.

Formato de celda: Oculta.


En cualquier otra celda, fuera del rango 'ocultado', veríamos el contenido (valor o función) en nuestra Barra de fórmulas.

lunes, 14 de abril de 2014

La función IMPORTARDATOSDINAMICOS en Tablas dinámicas.

Profundizaremos en la posibilidad de trabajar con datos a partir de información resumida mediante Tablas dinámicas, se trata en realidad de obtener valores de una Tabla dinámica mediante el uso de la función IMPORTARDATOSDINAMICOS.
Muy importante recordar que para emplear esta función debemos activar desde las Opciones de tabla dinámica la herramienta Generar GetPivotData!!!.


Veamos un ejemplo práctico, partiremos del siguiente listado que representa la recogida de efectivo (monedas) de una pequeña tienda de 'chuches' en diferentes días, y a partir de este listado hemos construido una tabla dinámica con la configuración que se ve en la imagen siguiente:

La función IMPORTARDATOSDINAMICOS en Tablas dinámicas.



Observemos que he optado por modificar los nombres de los elementos resumidos.
El diseño ha consistido en llevar el campo 'Fecha' al área de filtro de página y los campos '2 eur', '1 eur', etc al área de valores, resumido por Suma, además he recolocado la distribución de los valores por filas.


Bien, la meta es trabajar sobre estos datos para determinar cuál es el total de euros ingresado en un día cualquiera (por ejemplo el 21/1/2014), sabiendo el número de monedas para cada valor.
En este caso trabajaremos en un rango anexo al de la tabla dinámica, a la izquierda para evitar futuras superposiciones y borrado de datos.


Veamos la fórmula completa que nos resolverá el problema:
=SI(DERECHA(N6;3)="eur";IMPORTARDATOSDINAMICOS(TEXTO(N6;"@");$N$5)*VALOR(IZQUIERDA(N6;ENCONTRAR("_";N6)-1));IMPORTARDATOSDINAMICOS(TEXTO(N6;"@");$N$5)*VALOR(IZQUIERDA(N6;ENCONTRAR("_";N6)-1)/100))



La fórmula es un poco larga, pero sencilla de entender por partes.
Lo más importante, y objetivo de esta entrada:
IMPORTARDATOSDINAMICOS(TEXTO(N6;"@");$N$5)

con esta función nos referimos a la tabla dinámica situada a partir de $N$5 y en concreto al dato que corresponde con el primer argumento:
TEXTO(N6;"@")
es decir, al valor resumido correspondiente al elemento '2_ eur'... y ojo con el tratamiento que le hemos dado, para que Excel comprenda que nos referimos al elemento '2_ eur' (o cualquier otro) forzamos con la función TEXTO y un formato "@".
Esto nos permitirá arrastrar nuestra fórmula aprovechándonos de los elementos ya definidos en la tabla dinámica.


El resto de la fórmula es un condicional SI que distingue con funciones de texto si el valor facial de la moneda a estudio es de euros o céntimos, realizando el producto por el valor facial correspondiente.

Finalmente sólo nos quedaría sumar el resultado de nuestras fórmulas...

jueves, 10 de abril de 2014

VBA: Cómo transponer datos según cambio de criterio.

Automatizaremos hoy, mediante una macro, un proceso que transponga nuestros datos de vertical a horizontal según los diferentes cambios o saltos que se produzcan en uno de los campos.

Veamos un ejemplo donde aclarar la misión del día. En el listado siguiente tenemos tres campos, en los que el primero de ellos tiene agrupados los diferentes Códigos, y para código se detallan un número indeterminado de elementos en el campo DETALLE::

VBA: Cómo transponer datos según cambio de criterio.


El objetivo es llegar a:

VBA: Cómo transponer datos según cambio de criterio.



El objetivo queda algo más claro ahora, debemos conseguir transponer los valores del DETALLE para cada cambio en el CÓDIGO.

Así añadiremos nuestro código, macro Transponer, en un módulo de nuestro proyecto VBA:

Sub Transponer()
Dim fila As Long, filaN As Long, columna As Long
'seleccionamos la hoja con el orgien de datos
Sheets("hoja2").Select
Set miRango = Sheets("Hoja2").Range("B2:B41")
A = Application.WorksheetFunction.CountA(miRango)

fila = 1
'CÓDIGO
Hoja4.Range("A1").Value = Hoja2.Range("B1").Value
'CLIENTE
Hoja4.Range("B1").Value = Hoja2.Range("C1").Value
'DETALLE
Hoja4.Range("C1").Value = Hoja2.Range("D1").Value

'definimos punto de partida para recorrer celdas
filaN = 1: columna = 2
'hacemos un loop para pasar por todos los registros
For i = 1 To A
    fila = fila + 1
    'cuando el Código sea el mismo que el anterior
    If Hoja2.Range("B" & fila) = Hoja2.Range("B" & fila - 1) Then
        'nos desplazamos una columna a la izquierda
        columna = columna + 1
        Hoja4.Cells(filaN, columna).Offset(0, 1).Value = Hoja2.Cells(fila, 4).Value
    Else
        'si no es el mismo, plasmamos los valores correspondientes
        filaN = filaN + 1
        Hoja4.Cells(filaN, 1).Value = Hoja2.Cells(fila, 2)
        Hoja4.Cells(filaN, 2).Value = Hoja2.Cells(fila, 3)
        Hoja4.Cells(filaN, 3).Value = Hoja2.Cells(fila, 4)
        'fijamos de nuevo para la comparativa a la columna B
        columna = 2
    End If
Next i
'liberamos la variable
Set miRango = Nothing
End Sub



Tras ejecutar nuestra macro, observaremos que por cada cambio o salto en el campo CÓDIGO se transponen los diferentes valores asociados a ese CÓDIGO para el campo DETALLE, independientemente del número de elementos para cada Código.

lunes, 7 de abril de 2014

Exportar o Importar la barra de herramientas de acceso rápido personalizada.

En un comentario de hace algunos días un lector me preguntaba por la forma de 'llevarse' consigo la configuración de su barra de herramientas de acceso rápido.
Esta explicación da respuesta a la cuestión planteada por un lector:

¿Es posible trasladar la barra de herramientas personalizada de Excel 2007 a otro PC?.
¿En que archivo guarda estos cambios?



Claro que todo sería más sencillo de explicar si la versión de Excel fuera 2010 o 2013, ya que en estas versiones existe un botón en las Opciones de Excel > menú Barra de herramientas de acceso rápido > Importar o Exportar desde donde realizar la acción; este nos guardará un Archivo de UI exportado de Office

Exportar o Importar la barra de herramientas de acceso rápido personalizada.


Tras presionar nuestro botón y seleccionar la acción (exportar en nuestro caso) correspondiente nos indicará la localización para guardar el archivo:

Exportar o Importar la barra de herramientas de acceso rápido personalizada.



El problema viene para versiones anteriores, ya que no existe esta posibilidad....
La solución pasa por buscar un archivo en particular donde Office guarda esta configuración.
Nuestro objetivo será encontrar un archivo llamado Excel.xlb o bien el archivo Excel.qat .
Puedes leer un poco más al respecto en este link de Microsoft.

Para localizar este fichero habrá que buscar (dependiendo de la versión de Windows que tengas) en uno u otro lugar. En mi caso con Windows 7 (creo que Windows Vista es igual), la ruta completa será:
C:\Users\Excelforo\AppData\Local\Microsoft\Office



Para versiones anteriores de Windows buscaremos en:
C:\Documents and Settings\(Nombre de usuario)\Local Settings\Application Data\Microsoft\Office


Bastará copiar ese fichero y pegarlo en la misma localización en el PC destino; Excel lee ese fichero siempre que exista, en caso de no existir, lo crea automáticamente con la configuración actual...

miércoles, 2 de abril de 2014

VBA: SELECT CASE para distribuir datos entre hojas.

En más de una ocasión he expuesto usos de la instrucción SELECT CASE, y en esta ocasión (cuando las posibilidades de elección son altas), motivado por la pregunta de un lector, volveré a dar una explicación de cómo emplearlo:

Realice una Macro para un Formulario de introducción de datos Codigo-Nombre-Dirección-Telefono-Email y 5 hojas con los mismos campos.
El código se refiere a nombre de la calle de la dirección(BO-VE-FE-FR-BE) ese yo lo introduzco en el campo CODIGO, tengo 5 hojas con diferente nombre de calle (BONELLI-VENERE-FERRATO-FERRARI-BENEDETTI) y una con el nombre FORMULARIO donde se ingresan los datos, Necesito que al introducir los datos en este formulario se transfieran a la hoja correspondiente de acuerdo al código.


Esta vez se trata de dirigir datos registrados en una plantilla (una de nuestras hojas de cálculo llamada 'Formulario') hacia diferentes hojas del mismo libro, según corresponda al código introducido.

Veamos el asunto algo más claro. Tenemos una primera hoja con datos introducidos, en cuyo primer campo (columna A) aparecen ciertos códigos que corresponden a las hojas de color verde siguientes:

VBA: SELECT CASE para distribuir datos entre hojas.


En la imagen vemos, a modo de ejemplo, dos registros con dos códigos distintos FR y CO... lo que deberá llevarse a dos hojas distintas: FR a la hoja 'Ferrari' y BO a la hoja 'Bonelli'.

Para ello insertamos un módulo en nuestro proyecto VBA con el siguiente código:

Sub Traspaso()
Dim fila As Long, ultfila As Long
Dim rng As String

'recorremos los diferentes registros del Formulario
For Each celda In Range("TblDatos[Codigo]")
    fila = celda.Row
    rng = "A" & fila & ":" & "E" & fila
    Set origen = Sheets("Formulario").Range(rng)
    'identificamos la hoja destino, según 'Código'
    Select Case celda.Value
        Case "BO": Set destino = Sheets("Bonelli")
        Case "VE": Set destino = Sheets("Venere")
        Case "FE": Set destino = Sheets("Ferrato")
        Case "FR": Set destino = Sheets("Ferrari")
        Case "BE": Set destino = Sheets("Benedetti")
        Case Else: MsgBox "Código no válido": Exit Sub
    End Select

    'copiamos el registro a la hoja destino
    origen.Copy Destination:=destino.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
Next celda
End Sub



A su vez, en la ventana del código asociado a la hoja 'Formulario', para automatizar el proceso 'Traspaso' incluimos un evento _Deactivate, para que al salir de la hoja 'formulario' realice el traspaso de información:

Private Sub Worksheet_Deactivate()
    Call Traspaso
End Sub



En este caso lo interesante no es el paso de copiado de registro, si no cómo identificamos el valor del 'Codigo' y mediante SELECT CASE los dirigimos a la hoja correcta, definiendo una variable con objeto... lo que facilita posteriormente su uso par el pegado en la hoja destino.

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'.