Hola a todos!, espero que estéis bien : )

En el post de hoy, tal y como podéis ver en el título de la entrada, voy a programar un algoritmo para generar la sucesión de Fibonacci. Ya me apetecía hacerlo en VBA después de varias publicaciones sobre TypeScript.

Sobre la Suceción de Fibonacci, aquí podéis leer un poco acerca de lo que se trata.

Básicamente se podría describir como: Una sucesión que comienza con los números 0 y 1 y a partir de estos, cada término es la suma de los dos anteriores. Como ejemplo los 15 primeros números: 0|1|1|2|3|5|8|13|21|34|55|89|144|233|377

Esto se puede hacer de varias formas, normalmente se utiliza un loop a través del cual generar el algoritmo y se muestra en una columna o una fila. Para mi ejemplo voy a utilizar un for-next y lo mostraré en tantas columnas como sean necesarias según el rango que haya establecido en el código. Sin duda más complejo pero más completo.

Veamos el código:

Sub ALGORITMO_FIBONACCI()
    Dim Contador    As Long, Columna As Long, n As Variant, j As Variant
    Dim nValor      As Variant, MiArray As Variant, Formulario As Variant
    Dim i           As Long
    'Mostramos ventana para indicar elementos por columna y total de números a generar
    Formulario = InputBox("INDICA LARGO DE COLUMNA Y TOTAL DE NÚMEROS A GENERAR:" & Chr(13) & _
    Chr(13) & "EJEM: 15,75", "GENERAR ")
    If Formulario = Empty Then Exit Sub
    On Error GoTo etiqueta
    MiArray = Split(Formulario, ",")
    On Error GoTo 0
    'limpiamos contenido previo
    With ActiveSheet
        .Range("A1", ActiveCell.SpecialCells(xlLastCell)).Select
        Selection.Clear
        'Cargamos valores iniciales de las variables
        n = 0
        j = 1
        nValor = 0
        Contador = 1
        Columna = 1
        'Iniciamos loop
        For i = 1 To MiArray(1)
            If Contador <= MiArray(0) Then
                'Pasamos a formato número
                'mostramos valor inicial 0 y luego calculado
                .Cells(Contador, Columna).NumberFormat = "0"
                .Cells(Contador, Columna).Value = nValor
                'calculamos con el algoritmo
                nValor = n + j
                j = n
                n = nValor
                Contador = Contador + 1
            Else
                'El el contador es superior a longitud de la columna.
                'saltamos a la próxima columna
                i = i - 1
                Contador = 1
                Columna = Columna + 1
            End If
        Next i
    End With
    Exit Sub
    'Si cometemos un error en dato en la ventana inicial mostramos mensaje
etiqueta:
    MsgBox ("VERIFICA LOS DATOS QUE HAS INTRODUCIDO E INTÉNTALO DE NUEVO"), vbExclamation
End Sub

Como podéis ver he creado una ventana de diálogo para introducir dos elementos que nos ayudarán a mostrar la información:

En el ejemplo, el 15 significa que cuando los números lleguen a 15 celdas automáticamente seguirán en la siguiente columna. Es el largo máximo de cada columna.

El 75 es la cantidad de números a generar. En el ejemplo lo veréis perfectamente.

El resto del código está comentado, pero fundamentalmente este pequeño fragmento del código es la clave:

...
nValor = n + j
j = n
n = nValor
...

Es donde pasaremos el valor actual al anterior y realizaremos la suma. El resto del código es necesario para controlar las columnas y los índices del loop.

Lo podríais realizar con otro tipo de loops, ej: Do While o Do Until. o también otros métodos de programación. Es cuestión de preferencias y necesidades : )

Como sabéis el tema de Excel y el tratamiento de números grandes tiene sus características y es necesario tenerlo en cuenta. Para este ejemplo he evitado que se muestren los números con notación científica, creo que así se ve más claro.

Por otra parte os recuerdo que Excel reemplaza con un cero los dígitos de un número que sean superiores a 15, ejemplo: 1304969544928660, el 0 es el dígito 16 del número. En palabras de Microsoft: Excel sigue la especificación IEEE 754 acerca de cómo almacenar y calcular los números de punto flotante. Por lo tanto, Excel almacena solo los 15 dígitos significativos de un número y cambia a ceros los dígitos que pasan de la decimoquinta posición. Ver aquí

Y esto es todo!, espero que os sea de utilidad y lo podáis utilizar en vuestros proyectos o tareas.

PD: Ya sé que esto se puede hacer en el hoja Excel simplemente sumando el 0 y el 1 y arrastrar la fórmula:

Pero el reto es hacerlo mediante un algoritmo en VBA sin necesidad de tocar la hoja para generar el dato. No obstante, esta es otra alternativa : )

Descarga el archivo de ejemplo pulsando en:

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post