Queremos emular un display compuesto por siete segmentos luminosos, que según el número que se quiera presentar, lucen o no lucen. En el dibujo a mano alzada de la izquierda vemos en primer lugar los siete segmentos, numerados, y a continuación los números del 0 al 9 formados por el conjunto de segmentos que al lucir representan un número.
Para representar el display consideramos que cada segmento corresponde con una celda, a la que damos forma alargada, según la forma de los segmentos que forman los display. Emulamos si un segmento luce o no luce mediante el uso del formato condicional. Apagado con el tono general de las celdas de la hoja y encendido con un tono brillante (rojo).
Determino si un segmento debe lucir de dos maneras, lo que me permite utilizar las siguientes funciones:
si()
y()
o()
indirecto()
Indice()
Además hago una conversión de decimal a binario del número a presentar.
Primero hay que decidir, para todos los segmentos, si un determinado segmento debe lucir o no para cada número.
En la hoja "Segmentos" analizo todos los números y el efecto que hace sobre cada segmento, en el rango a1:h11. A su vez traslado los valores correspondientes al número seleccionado ( de 0 a 9) al rango B10:b16 de la hoja "Display" mediante las funciones Indirecto e Indice. Aunque este traslado no es necesario despeja el panorama. Utilizo además un nombre para referirme a la matriz A1:H11 (Segmentos). Una vez trasladados estos valores a la hoja "Display", rango B10:b16, los utilizo para dar un formato condicionado a los siete segmentos que forman el display.
Aunque esta primera versión de la emulación de un display funciona correctamente es mejorable, no necesario desplegar la matriz (hoja segmentos, rango A1:H11) en la que se analiza cada segmento para cada valor del número. Tampoco es necesario trasladar esos valores de una hoja a otra para poder utilizarlos en el formato de los segmentos.
El nuevo análisis para saber si un segmento luce o no luce lo hago con las funciones lógicas Y() y O(). Se puede utilizar solo una de ellas, de echo es mucho mas intuitivo utilizar la función O(), aunque resultan formulas mas cortas con la función Y().
Seg. | Fórmula |
---|---|
1 | =Y($B$2<>1;$B$2<>4) |
2 | =Y($B$2<>1;$B$2<>5;$B$2<>6) |
3 | =Y($B$2<>1;$B$2<>2) |
4 | =O($B$2=0;$B$2=2;$B$2=3;$B$2=5;$B$2=6;$B$2=8) |
5 | =O($B$2=0;$B$2=1;$B$2=2;$B$2=6;$B$2=8) |
6 | =Y($B$2<>2;$B$2<>3;$B$2<>7) |
7 | =Y($B$2<>0;$B$2<>1;$B$2<>7) |
Como vemos es mas fácil o intuitivo utilizar la función O(). Si leemos la línea 4, B2=0 o B2=2 o B2=3 o B2=5 o B2=6 o B2=8 vemos que equivale a b2<>1 y B2<> 4 y B2 <> 7 y B2 <> 9, que tiene un menor número de comparaciones. Si leemos la línea 1 (B2 <>1 y B2 <>4) , su equivalente con la función O() sería (B2=0 o B2=2 o B2=3 o B2=5 o B2=6 o B2=7 o B2=8 o B2=9) , que es mas fácil de desarrollar pero es mas "pesada", tiene un número de comparaciones mayor.
La nueva versión de la emulación
¿ Como damos un nombre a un rango ? Muy fácil :
¿Para que nos sirve esta operación?
Nos permite referirnos a un rango con un nombre, en vez de con una dirección, con un nombre de variable.
En el libro Display.xls utilizo para referirme al rango A1:H11 de la hoja "Segmentos" el nombre Segmentos. Cuando traslado los valores, para un número concreto, que darán formato al display utilizo la función Indice con referencia al rango en la celda B11 de la hoja Display (=INDICE(Segmentos!B2:H11;$B$4;2)) y utilizo la función Indice con referencia al nombre en las celdas B12 a B16 (=INDICE(Segmentos;$B$4;5))
En la segunda versión del libro, Display2.xls, ni traslado los valores de hoja "Segmentos" ni me apoyo en un rango con los valores que dan el formato a emulación del display. Utilizo fórmulas y nombres directamente en el formato condicional.
Primero defino los siguientes nombres:
Nombre | Se refiere a |
---|---|
Num | =Display!$B$2 |
Num1 | =Num+1 |
FormC1 | =Y(Num<>1;Num<>4) |
FormC2 | =Y(Num<>1;Num<>5;Num<>6) |
FormC3 | =Y(Num<>1;Num<>2) |
FormC4 | =O(Num=0;Num=2;Num=3;Num=5;Num=6;Num=8) |
FormC5 | =O(Num=0;Num=1;Num=2;Num=6;Num=8) |
FormC6 | =Y(Num<>2;Num<>3;Num<>7) |
FormC7 | =Y(Num<>0;Num<>1;Num<>7) |
Con estos nombres directamente entramos a la opción de formato condicional, de la siguiente manera:
Como se puede ver, en las fórmulas de los formatos ya no utilizo la referencia B2, utilizo el nombre de variable "Num", que aunque en estas fórmulas solo utilizo una variable, siempre es mas sencillo utilizar nombres de variables que rangos excel que pueden llegar a tener un número elevado de caracteres. Pensemos que si queremos referirnos a un rango B2, variable Num, en otra hoja, por no hablar de en otro libro, sería NomHoja!$B$2.
En la conversión a binario del número decimal Num, hoja Display G1:J3 utilizo la función Si(), el operador * (por) y nombres de variables. Realmente pienso sacarle mucho mas provecho a esta operación, pero de momento se queda como está.
No hay comentarios:
Publicar un comentario