martes, 14 de agosto de 2018

Ábaco Soroban en Excel

Construiremos hoy un ábaco japonés (llamado también Soroban). muy similar en funcionamiento al ábaco romano, siendo acaso este último algo más completo, puesto que incluía partes fraccionadas...

¿Qué necesitamos?
1- funciones sencillas del tipo condicional SI y una función SUMAPRODUCTO para verificar el correcto funcionamiento.
2- un formato condicional
3- controles de formulario (NO ActiveX), sin programación...

Ábaco Soroban en Excel



El primer paso es incorporar los controles de formulario de tipo 'control de número' en grupos de cinco en las celdas: B5:F5 y B9:F9

Estos controles los asociaremos a cada una de las celdas sobre las que se sitúa, esto es, el control en la celda B5 se vincula a B5:

Ábaco Soroban en Excel



Y así sucesivamente para los 10 controles.

Los controles de la fila superior B5:F5 deberán tener como propiedades:
Valor mínimo: 0
Valor máximo: 1


Mientras que los controles de las celdas B9:F9 deben ser:
Valor mínimo: 0
Valor máximo: 4


Los controles superiores representarán la parte de arriba del ábaco japones, que mostrarán los incrementos/decrementos de los múltiplos de 5 (5, 50, 500, 5000, 50000, etc)
Y los controles inferiores, la parte de abajo del ábaco, que muestra los aumentos/disminuciones de unidades, decenas, centenas, millares, etc...


Vamos a por la parte de funciones, así pues en el rango superior B6:F7 insertamos la fórmula:
=SI(B$5+1<=2-FILAS(B$6:B6);0;SI(B$5>2-FILAS(B$6:B6);B$4;""))

Con esta fórmula conseguimos que cuando pulsemos el control hacia arriba el valor de la cuenta correspondiente baje.
En este caso he optado por añadir formulación para que si no está pulsado la 'cuenta' aparezca como cero y solo si está pulsada la cuenta baje con el valor asignado.
Fíjate en el ejemplo siguiente donde se representa el número 5.050 y donde la cuenta de 5.000 y la de 50 están bajadas

Ábaco Soroban en Excel



De forma similar formulamos la parte inferior del ábaco en el rango B10:F14 incluyendo la fórmula:
=SI(B$9+1=FILAS(B$10:B10);B$8;""))

Ajustándose a lo que necesitamos, es decir, que cuando subimos la 'cuenta' aparezca el valor de ésta, y cuando está bajada muestre un cero.
En el ejemplo representamos el número 1.234

Ábaco Soroban en Excel



Para verificar la corrección del uso aplicamos en la celda I6 la fórmula:
=SUMAPRODUCTO(B4:F4;B5:F5)+SUMAPRODUCTO(B8:F8;B9:F9)

donde simplemente multiplicamos el valor representativo de las cuentas (B4:F4 y B8:F8) por el número de cuentas subidos o seleccionados en cada caso...


Terminada la formulación aplicaremos un formato condicional con fórmula, para ello seleccionaremos el rango B6:F7 y B10:F14
Nos aseguraremos que la celda activa sea B6 y añadiremos la fórmula:
=Y(B6<>"";B6>0)

con el formato deseado...

Ábaco Soroban en Excel



Listos para calcular con nuestro ábaco soroban.

Por ejemplo para mostrar el 13.131 subiríamos/bajaríamos las cuentas...

Ábaco Soroban en Excel

jueves, 9 de agosto de 2018

VBA: Color RGB y el Círculo Cromático en Excel

Llevaba tiempo queriendo escribir sobre este tema de los colores RGB en Excel, y no he encontrado mejor forma que haciéndolo sobre el Círculo Cromático de 12 colores (ni el más simple ni el más completo).
Si no te suena qué es esto, puedes leer algo más en Wikipedia


En este caso lo más importante es conocer la combinación RGB de esos doce colores...



Nuestra gama de colores está dividida en tres colores primarios:
amarillo = RGB 255-255-000
rojo = RGB 255-000-000
azul = RGB 000-000-255

Tres colores secundarios:
Naranja = rojo + amarillo= RGB 255-166-000
Violeta = rojo + azul = RGB 128-000-128
Verde = azul + amarillo = RGB 000-255-000

y seis terciarios:
Naranja amarillento = naranja + amarillo = RGB 255-198-000
Rojo anaranjado = rojo + naranja = RGB 255-090-004
Violeta rojizo = violeta + rojo = RGB 206-000-099
Azul violáceo = azul + violeta = RGB 132-008-255
Verde azulado = verde + azul = RGB 000-160-140
Amarilloso verdoso = verde + amarillo = RGB 222-255-000


Nuestro objetivo es construir un gráfico con los colores del tipo seleccionados en las celdas K1:K3.

Para ello añadimos tres 'casillas de verificación' vinculadas cada una de ellas a la celda que tiene debajo (en K1:K3).
A modo de ejemplo veamos la primera..

VBA: Color RGB y el Círculo Cromático en Excel



A partir del resultado obtenido en las celda vinculadas K1:K3 se rellenarán las fórmulas del campo 'Selección' en la tabla 'TblCromatica'.
La fórmula será un sencillo condicional para marcar rápidamente las filas con las que trabajar.
Para las filas de colores primarios añadimos:
=SI($K$1;"x";"")

Para las filas de colores secundarios:
=SI($K$2;"x";"")

Y para las filas de terciarios:
=SI($K$3;"x";"")

VBA: Color RGB y el Círculo Cromático en Excel



Estas 'equis' nos servirán posteriormente en la macro para saber qué colores trasladar al gráfico.

En el paso siguiente generamos un rango K10:N21 al que hemos asignado un nombre definido:
rngColores =colores!$K$10:$N$21

además en el rango O10:O21 hemos añadido la siguiente fórmula:
=SI(K10<>"";1/CONTARA($K$10:$K$21);"")

que permite asignar una parte igual en función de los colores trasladados o seleccionados en K1:K3.

VBA: Color RGB y el Círculo Cromático en Excel



Por otra parte sobre el rango discontinuo: K9:K21 + O9:O21 construimos un gráfico Circular con la leyenda a la derecha y sin título de gráfico, y al que he llamado 'chCirculoCromatico'.

Este gráfico es necesario que exista para el correcto funcionamiento de la macro siguiente...


Tenemos todo lo necesario:
1- controles del tipo 'casilla de verificación' (tres, uno por tipo: primario, secundario y terciario)
2- una tabla con la información de los colores y sus valores de color RGB (tabla 'TblCromatica')
3- un rango K9:O21 donde volcar datos desde la 'TblCromatica' y que
4- alimentará el gráfico circular llamado 'chCirculoCromatico'


Insertaremos el siguiente procedimiento en un módulo estándar, para luego asociar la macro a un botón:

Sub CirculoCromatico()
'limpiamos datos anteriores
Range("rngColores").ClearContents

Dim rng_R As Range, rng_G As Range, rng_B As Range
Set rng_R = Range("TblCromatica[Red]")
Set rng_G = Range("TblCromatica[Green]")
Set rng_B = Range("TblCromatica[Blue]")

Dim rng_Color As Range
Set rng_Color = Range("TblCromatica[Color]")

'TRasladamos nueva selección
Dim color As String
x = 0: y = 0
For Each celda In Range("TblCromatica[Selección]")
    y = y + 1
    'recuperamos valores de la TblCromática
    color = rng_Color.Item(y).Value
    rojo = rng_R.Item(y).Value
    verde = rng_G.Item(y).Value
    azul = rng_B.Item(y).Value
    'si el color está seleccionado
    If celda.Value = "x" Then
        'llevamos datos al área del gráfico
        '1.descripción del color
        Range("K10").Offset(0 + x, 0).Value = color
        '2. valor de rojo
        Range("K10").Offset(0 + x, 1).Value = rojo
        '3. valor de verde
        Range("K10").Offset(0 + x, 2).Value = verde
        '4. valor de azul
        Range("K10").Offset(0 + x, 3).Value = azul
        
        x = x + 1
        'y trasladamos el color al punto de la serie del gráfico
        'ajustamos el color de cada partición del gráfico
        'que YA está creado y se llama 'chCirculoCromatico'
        Set ChtObj = ActiveSheet.ChartObjects("chCirculoCromatico")
        With ChtObj
            Set ser = .Chart.SeriesCollection(1)
            'punto.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            'llevamos el color al punto de la serie
            With ser.Points(x).Format.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(rojo, verde, azul)
                .Transparency = 0
                .Solid
            End With
        End With
    End If
Next celda

'liberamos memoria
Set rng_R = Nothing
Set rng_G = Nothing
Set rng_B = Nothing
Set rng_Color = Nothing
Set ser = Nothing

End Sub



Hemos finalizado. Podemos seleccionar en los controles la categoría de color a mostrar en nuestro círculo cromático...

Por ejemplo, solo primarios..

VBA: Color RGB y el Círculo Cromático en Excel



O Primarios y Secundarios..

VBA: Color RGB y el Círculo Cromático en Excel



O cualquier otra combinación posible...

martes, 7 de agosto de 2018

Los Divisores y los Números Perfectos en Excel

Hablaremos hoy de un tema curioso, de los Números perfectos.
Si leemos algo más sobre estos números en Wikipedia (aquí), comprenderemos rápidamente en qué consiste.

Un número perfecto es un número natural que es igual a la suma de sus divisores propios positivos. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo.


Así pues la clave del asunto, para obtener o conocer si un número es perfecto, es poder recuperar un listado de los divisores de cualquier número natural...

Generamos una serie de enteros desde 2 hasta 500 en las celdas B2:B500, e insertaremos la función personalizada en VB que veremos a continuación en el rango continuo C2:C500...

Los Divisores y los Números Perfectos en Excel



Insertaremos la siguiente función personalizada en un módulo estándar:

Function DivisoresFx(x As Integer)
Application.Volatile

Dim i As Integer, acum As Long

acum = 0
'recorremos en descendente todos los números inferiores al Valor buscado
'por eso empezamos en x-1
For i = (x - 1) To 1 Step -1
    'comprobamos es divisible
    'esto es, es un divisor...
    If x Mod i = 0 Then
        'en ese caso acumulamos/sumamos a los divisores previos...
        acum = acum + i
        txt = i & "+" & txt
    End If
Next i

'devolvemos valor a lal función en la hoja de cálculo
If acum = x Then
    'si cumple la condición de número perfecto
    ' es un número natural que es igual a la suma de sus divisores propios positivos.
    DivisoresFx = "Número Perfecto" & "-" & Left(txt, Len(txt) - 1)
ElseIf acum = 1 Then
    'si cumple la condicío de primo
    'se divisible solo por si mismo y por uno
    DivisoresFx = "Primo"
Else
    'resto de números...
    DivisoresFx = "-"
End If

End Function



Lo que logramos con esta función es determinar, a partir de un número, cuáles son sus divisores... evaluando si además, la suma de estos divisores coincide con el valor origen (condición para que sea Número Perfecto)...
Para su fácil evaluación hemos incluido el listado de los divisores que corresponden a estos 'Números perfectos'
Si comprobamos los tres incluidos en el rango de 2 a 500:
6 Número Perfecto=1+2+3
28 Número Perfecto=1+2+4+7+14
496 Número Perfecto=1+2+4+8+16+31+62+124+248

verás que coinciden con el listado descubierto por Euclides.. el siguiente Número perfecto es 8128.. por si te interesa comprobarlo ;-)


Además, y como curiosidad añadida, si el único divisor de un número es 1, sabremos que éste es un número primo ver esta otra entrada del blog).


Son bastantes peculiares estos números y aún parecen tener bastantes cosas por demostrar...