Traducir el blog

Cómo calcular números Fibonacci con VBA

Posted on diciembre 10, 2021 by Excel Pedro Wave

Trilogía para calcular la sucesión de Fibonacci

  1. Cálculo iterativo de Fibonacci
  2. Cómo calcular números Fibonacci con VBA
  3. Calculando números grandes Fibonacci. Artículo dividido en 2 fragmentos:
    1. Calculadora de números grandes Fibonacci
    2. Diseño de la calculadora Fibonacci

Lo importante para resolver problemas de cálculo es usar los tipos de datos adecuados dentro de un algoritmo, y eso es lo que voy a explicar en este artículo.

Como ejemplo de cálculo vamos a calcular la sucesión de Fibonacci, que es infinita, por lo que el cálculo se ha limitado hasta el elemento o hijo: F(139) con 29 cifras significativas.

Con este cálculo se demostrará que se puede traspasar el límite de 15 cifras significativas de las celdas de Excel, programando macros en lenguaje VBA con números de tipo Decimal.

El resultado del algoritmo de cálculo es el siguiente:


Aclaración: En esta imagen se han agrupado los primeros 140 números de Fibonacci en varias columnas, para que quepan todos en un pantallazo. En la plantilla, que se puede descargar más abajo, los números de Fibonacci se calculan uno en cada fila.

Fíjate en la indicación que hay a partir del elemento F(74), avisando que son números almacenados como textos, por si se desea convertirlos en números.

¡Ni se te ocurra! ¡Pues perderás la precisión de los números!


Límites numéricos

El límite de 15 dígitos significativos para números en celdas existe en todas las versiones de Excel conocidas, como se explica en estas dos páginas:

Microsoft explica en esos dos artículos cómo guardar números grandes en Excel: ¡como texto dentro de las celdas!

¡Es tan frustrante que ni siquiera se puede guardar el número de una tarjeta de crédito de 16 cifras en una celda! ¡Hay que guardar los 16 dígitos como texto!

Por ejemplo, si queremos guardar el número de nuestra tarjeta de crédito:

  • Se debe escribir una comilla simple (') antes del número. Por ejemplo: '1234567812345678
  • O dar formato de Texto a la celda:
    • En esos dos casos el número se guarda como texto.
    • Es adecuado para números de tarjetas de crédito.
    • Pero el problema es que es muy difícil, casi imposible, hacer cálculos con números guardados como textos.
    • Aunque el aviso de la celda lo sugiera, ¡ni se nos ocurra convertirlo en número!, pues ocurrirá lo que explico a continuación.
  • Si escribimos el número sin la comilla simple: 1234567812345678
    • Se trata como un número y la última cifra se pone a cero: 1234567812345670
    • ¡Lo que no es de desear!
    • ¡Ya no es el número de nuestra tarjeta de crédito!
    • ¡No se pueden guardar más de 15 cifras significativas de un número!

En el ejemplo de esta captura se introduce el mismo número de 16 cifras (1234567812345678) en las 3 celdas:

  • En A1 se introduce el número de 16 cifras como texto. ¡Correcto! ¡Pero no es un número!
  • En C1 se convierte automáticamente en un número de coma flotante. ¡Error!
  • En E1, con formato numérico tipo 0, se pone a 0 la última cifra. ¡Error!

Este comportamiento se produce solo si la celda tiene el formato Número y el número especificado supera los 15 dígitos. Para las celdas con formato de texto, se pueden escribir hasta 32767 caracteres, aunque Excel solamente muestra los primeros 1024 caracteres en la hoja de cálculo.

O sea, que podemos guardar y visualizar números de hasta 1024 cifras en una celda con formato Texto, lo que es suficiente para el desafío de este artículo: escribir 29 cifras en una celda.


Números de más de 15 cifras

Lo siguiente lo he leído en esta página en inglés: Significant figures - Wikipedia

La mayoría de las calculadoras y programas de computadora pueden manejar el número π como 3,141592653589793 con 16 dígitos decimales, que se usa comúnmente en computadoras, y en la NASA para "los cálculos de mayor precisión del JPL para la navegación interplanetaria".

Pero Excel no llega ni siquiera a guardar números de 16 decimales. Aunque Excel siga la especificación internacional IEEE 754 para almacenar y calcular números de punto flotante, sólo almacena 15 dígitos significativos en un número y cambia los dígitos después del decimoquinto lugar por ceros, por lo que ni la NASA ni SpaceX pueden usar Excel para sus viajes interplanetarios...

¡A no ser que usen el lenguaje VBA para hacer cálculos con más de 15 cifras significativas!

Brian Sutter es el diseñador de la trayectoria de la misión Lucy de la NASA, que explorará los satélites de Júpiter, para la que programa macros en Excel con el tipo Decimal de datos.

¡Y eso es lo que también voy a hacer ahora para calcular los números de Fibonacci!


Calcular Fibonacci con VBA

En estos dos artículos se exponen algoritmos con macros en lenguaje VBA para calcular la sucesión de Fibonacci:

VBA: Números de Fibonacci en Excel | EXCEL FORO: Un blog de Excel

PROGRAMAR EL ALGORITMO DE SUCESIÓN DE FIBONACCI CON VBA EN EXCEL - Excel Signum

El primero está escrito por Ismael Romero, Microsoft MVP Excel desde 2014, que cuenta con uno de los mejores blogs que conozco sobre Excel.

El segundo está escrito por Segundo Miguéns Romeu, Microsoft MVP Office Apps and Services desde 2017, centrado principalmente en Excel, programación y Power Query.

Tengo que reconocer que sus blogs son muy instructivos, ¡pero sus cálculos de la sucesión de Fibonacci con VBA pueden mejorar!

Ismael usa variables del tipo Long en sus cálculos, por lo que el mismo avisa en su artículo que:

"Habrá que tener precaución con el límite de precisión de Excel (15 dígitos), ya que a partir del elemento 75, la precisión de Excel nos devolverá valores incompletos o no válidos."

Segundo usa variables del tipo Variant pero no las inicializa, por lo que un tipo Integer se promociona a un tipo Long y un tipo Long se promociona a un tipo Double, pero no se promociona automáticamente al tipo Decimal, ¡que es el que nos interesa usar para cálculos con números de hasta 29 cifras significativas!


Tipos de datos VBA

El tipo Double tiene como valor máximo: 1,79769313486232E308, pero con 15 dígitos significativos.

El tipo Decimal admite números de hasta: 79228162514264337593543950335 con 29 cifras, pero solo puede usarse como un subtipo de un tipo Variant. No se puede declarar directamente una variable de tipo Decimal. Sin embargo, se puede crear un tipo Variant cuyo subtipo sea del tipo Decimal con la función CDec.

Microsoft hace un resumen de todos los tipos de datos VBA en esta página:

Resumen de tipo de datos | Microsoft Docs

En la siguiente tabla he resumido todos los tipos de datos VBA, por lo que es conveniente colgarla de la cabecera de la cama, para saber programar macros sólidas y robustas:

Contiene enlaces a cada tipo de datos en español, lo que puede hacer que su traducción no sea exacta y se deba: Leer en inglés...


Algoritmo VBA Fibonacci

El algoritmo de la macro SucesiónFibonacci usa la función CDec, que convierte un tipo Variant en un tipo Decimal, para poder calcular el elemento F(139) con 29 cifras significativas:

Lo importante de esta macro es la definición de una variable Array Fib() del tipo Variant que, cuando se definen sus dos primeros elementos, se convierten explícitamente en tipo Decimal con la función CDec:

Fib(0) = CDec(0)

Fib(1) = CDec(1)

Los demás números Fibonacci se calculan mediante suma de los anteriores:

Fib(i) = Fib(i - 1) + Fib(i - 2)

La suma de números de tipo Decimal convierte implícitamente el resultado en tipo Decimal.

Los números de más de 15 cifras se guardan en las celdas convertidos a texto con la función:

CStr(Fib(i))

Esta es la hoja de cálculo 'VBA Fibonacci', vacía antes de hacer el cálculo:

En la celda E1 se escribe el valor máximo de X que se quiere calcular, que no puede ser mayor que 150, aunque sólo calcula hasta Fib(139) pues el tipo Decimal llega hasta 29 cifras significativas.

Haciendo clic en la espiral de Fibonacci comienza el cálculo.

Haciendo clic en la papelera se borra la tabla de números Fibonacci.

Haciendo clic en mi foto se abre la página de mi blog. 

En la hoja 'VBA Fib Simple' también se calcula la sucesión de Fibonacci, pero con un algoritmo mucho más simple e igual de efectivo, que conviene que estudies...


Descarga del algoritmo

El archivo de ejemplo, con la primera hoja protegida sin contraseña, se puede descargar desde cualquiera de estos enlaces:

Abre el archivo y habilita la edición y las macros para poder hacer los cálculos.


Vídeo: Cómo calcular números Fibonacci con VBA

En este vídeo explico como programar macros VBA con las que calcular números de hasta 29 cifras significativas:


Otros algoritmos de cálculo

Mientras me documentaba descubrí que se me había adelantado Benjamín Martín-Palanco con estos algoritmos:

Nube de datos: Sucesión de Fibonacci en Excel y VBA

Nube de datos: Sucesión de Fibonacci en R 

Ahora falta conseguir mas de 139 elementos Fibonacci, con Excel y VBA, como se hace con R, que lo consigue gracias a la clase bigz: Large Sized Integer Values.

¿Cómo conseguir F(140) y sucesivos números de Fibonacci en VBA de Excel?

La respuesta a esta pregunta la dejo para otro artículo.

No Response to "Cómo calcular números Fibonacci con VBA"

Leave A Reply

Dime si te gusta lo que lees y, si no te gusta, dime por qué. Tengo habilitada la moderación de comentarios. Tu comentario se publicará pronto.

Mi lista de blogs