En teoría, el cálculo de los dos dígitos de control del IBAN español debería ser tan sencillo como calcular el módulo 97 del número formado por el Código de Cuenta de Cliente (CCC), con el añadido a su derecha de 142800, y sustraerlo de 98. Por ejemplo, si el código de la entidad bancaria es 9999, el de la sucursal 8888 y el de la cuenta 7777777777, la fórmula en Excel debería ser tan sencilla como:
=98-RESIDUO(99998888807777777777142800;97)
teniendo la precaución de anteponer un 0 si el resultado de la sustracción fuese < 10.
Pero esto (al menos en el caso de Excel) es sólo en teoría porque surgen dos problemas:
El primer problema radica en que la precisión numérica máxima de Excel es de 15 dígitos, por lo que si intentásemos procesar directamente 99998888807777777777142800 lo primero que haría Excel es convertirlo en 99998888807777700000000000, por lo que la función RESIDUO() calcularía mal el resto la mayor parte de las veces (y las que "acertara" sería por pura casualidad).
Pero esto sólo sería así en el supuesto de que RESIDUO() fuese capaz de procesar un número de 26 dígitos, que no lo es, porque este es precisamente el segundo problema: la función RESIDUO() provoca en Excel 2003 el error #¡NUM! si el dividendo de la división que ha de procesar RESIDUO() es ≥ 134.217.728 (227) veces el divisor, mientras que en Excel 2007-2010 se produce ese mismo error si el dividendo es ≥ 1.125.900.000.000 veces el divisor.
Como la división ha de hacerse entre 97, el número más alto posible para excel 2003 es
227·97-1 = 13019119615
y para Excel 2007-2010
1125900000000·97-1 = 109212299999999
Por lo tanto, para poder calcular el resto de 99998888807777777777142800 / 97 en Excel 2003, no queda otra (hasta donde yo sé) que "trocear" el número en porciones de forma que ni incluso en el peor de los casos ninguna de esas porciones pueda ser > 13019119615, y entregar esos trozos a la función RESIDUO(). Esta es la razón por la que la fórmula propuesta aquí:
=DERECHA(0&98-RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&DERECHA(A1;4)&1428;97)&"00";97);2)
trocea el número a procesar en 3 porciones de 8 dígitos y una última de 2 dígitos y va calculando los restos de cada una de las porciones. Al hacerlo así, en el peor de los casos el número a tratar sería el 9999999999 [dado que, como es obvio, a partir del 2º RESIDUO() hay que anteponer al "trozo" a calcular el resultado de las anteriores RESIDUO()], que obviamente es < 13019119615.
En Excel 2007-2010 el "despiece" del número a procesar podría hacerse en porciones de 14 dígitos, puesto que incluso en el peor de los casos 99999999999999 < 109212299999999, pero considero que es mejor una fórmula que valga en todas las versiones de Excel a otra que pueda o no funcionar dependiendo de la versión utilizada. En cualquier caso, he aquí la fórmula optimizada para las versiones de Excel 2007 y 2010:
=DERECHA(0&98-RESIDUO(RESIDUO(IZQUIERDA(A1;14);97)&DERECHA(A1;6)&"142800";97);2)
pero debo reiterar el aviso de que esta fórmula no funcionará en Excel 2003 (devolverá el error #¡NUM!).
Lo que queda de la fórmula es bastante sencillo: la concatenación 0&98 se usa para conseguir siempre 2 dígitos, incluso si el resultado de la sustracción es < 10, mientras que la función DERECHA(0&98...;2) se encarga de eliminar el cero superfluo de la izquierda si el resultado de dicha sustracción es >9.