jueves, noviembre 16, 2006

Excel – Diseño y Funcionalidad

Cuando creamos modelos en Excel, debemos siempre tener en cuenta el problema de la funcionalidad. Por funcionalidad entiendo la capacidad de crear hojas de cálculo eficientes en términos de velocidad de cálculo y libres de errores producto de diseños ineficientes.

Muchas veces nos vemos obligados a construir fórmulas complejas, cuando con ciertos cambios menores en el diseño de la hoja podríamos realizar el mismo cálculo con fórmulas más sencillas y por lo tanto más eficientes.

Veamos un ejemplo, basado en una consulta de uno de mis lectores.

En una hoja de Excel queremos calcular el descuento que nos corresponde recibir de una lista de proveedores, basado en la cantidad comprada y el plazo de pago.
En un cuaderno de Excel hemos creado las siguientes tablas:

- en la Hoja1 la tabla donde calculamos los descuentos





- en la Hoja2 las tablas auxiliares




Nuestra primer tarea es calcular el importe por unidad (el rango D2:D6 en la Hoja1), lo cual hacemos fácilmente con BUSCARH. Primero creamos un nombre que contenga el rango de la tabla de proveedores

Proveedor: =Hoja2!$A$1:$E$2

La fórmula para calcular el precio es =BUSCARH(B2,proveedor,2,0)

Los valores del rango E2:E6, Importe pedido, son calculados por el producto =A2*D2 para la fila 2, =A3*D3 para fila 3 y así sucesivamente.

Ahora tenemos que calcular el descuento. Este es función del tamaño del pedido y de la forma de pago. Existen 7 combinaciones posibles:



Podemos crear una fórmula que combine la función SI con la función Y. Dado que hay 7 condiciones posibles, nuestra fórmula "anidaría" 6 funciones SI, algo así como

=SI(Y(A2>=100, A2<150,c2="contado"),10%,si(y(a2>=150, A2<200,c2="contado"),12%,si(a2>=200,C2="contado),14%,SI…lo mismo para 30 días…))))))

Como ven una fórmula complicada, con buenas posibilidades de contener errores difíciles de detectar.

Pero con pequeños cambios en el diseño de las hojas podemos simplificar en gran medida la tarea.

Primero modificamos la tabla de descuentos



Hemos cambiado el encabezamiento de las columnas B y C y hemos agregado una fila para tomar en cuenta los pedidos de menos de 100 unidades.
El cambio de los nombres tiene por objetivo permitirnos crear dos nombres que contengan los rangos

Tamaño_Pedido =Hoja2!$A$13:$A$16
Contado =Hoja2!$B$13:$B$16
desc_30_dias =Hoja2!$C$13:$C$16

Luego modificamos la tabla de forma de pago



Ahora construimos una fórmula mucho más concisa para obtener el descuento en la columna F:

=INDICE(INDIRECTO(C2),COINCIDIR(A2,Tamaño_Pedido))

La función INDICE busca en la matriz definida por INDIRECTO(C2) y da como resultado el valor que se encuentra en la fila definida por la función COINCIDIR(A2,Tamaño_Pedido)

En C2 tenemos las condiciones de pago, que coinciden en dos casos casos, contado y desc_30_dias, con los nombres que hemos definido.

Así, en la fila 2, COINCIDIR da como resultado "1" y por lo tanto INDICE da 0%.
Usamos INDIRECTO para que Excel interprete el valor de la celda C2 como referencia al rango definido por el nombre y no simplemente como texto.



Como podemos ver, en las celda E3, E4 y E6 obtenemos un resultado #REF. Esto se debe a que no hemos definido nombres que coincidan con el valor de la función INDIRECTO.

Una de las formas de solucionar este problema es introduciendo una función SI,

=SI(TIPO.DE.ERROR(INDIRECTO(C2))=4,0,INDICE(INDIRECTO(C2),COINCIDIR(A2,Tamaño_Pedido)))

Aquí debemos usar la función TIPO.DE.ERROR y no ESERROR, dado que al evaluar INDIRECTO(C2) fuera del contexto de la funcion INDICE, siempre nos dará un resultado #VALOR!.

TIPO.DE.ERROR nos permite definir el error que buscamos (4 = #REF, pueden consultar la ayuda en línea de Excel).

Otra posibilidad es ampliar la tabla de descuentos para contemplar todos los casos



Todo lo que debemos hacer es crear nombres para los rangos de las distintas condiciones de pago. No hay necesidad de modificar las fórmulas del rango F2:F6 en las Hoja1.

Esta solución tiene la ventaja que nuestra fórmula será más breve y que nuestro modelo está preparado si quisiéramos agregar descuentos para las otras condiciones de pago en el futuro.





Categorias: Funciones&Formulas_span>

Technorati Tags:


lunes, noviembre 13, 2006

Metodos abreviados (Shortcuts) de teclado para la mano derecha

Todos conocemos los métodos abreviados de teclado de Office, Ctrl+C para copiar, Ctrl+X para cortar y Ctrl+V para pegar. Estos métodos están optimizados para la mano izquierda
En esta nota de Doug Klippert en Unofficial Microsoft Office Stuff veo que existen métodos abreviados para esta tareas, optimizados para la mano derecha:

Cortar: Shift + Delete {Mayúscula+Borrar}
Copiar: Ctrl + Insert {Ctrl + Insertar}
Pegar: Shift + Insert {Mayúscula + Insertar}


Categorías: Varios_

Technorati Tags:

Funcion JERARQUIA en Excel – Aplicar a parte de una lista.

Uno de mis lectores me propone el siguiente problema: queremos ordenar una lista de arqueros de fútbol de acuerdo al promedio de goles recibidos. Parte de los arqueros en la lista aún no han jugado (suplentes) y por lo tanto no deben ser tenidos en cuenta.
Buscamos una solución dinámica, sin tener que manipular manualmente la lista. Es decir, que todas las tareas sean hechas por fórmulas.

El problema es una variación del modelo que mostré en la nota Construir una tabla en Excel con las primeras 10 posiciones.

Supongamos que esta es nuestra arqueroslista de arqueros





Para calcular los promedio hemos usado una función condicional SI, para que aquellos que aún no han jugado aparezcan con promedio 0. El promedio del Arquero 1 es calculado por la fórmula =SI(B2=0,-1,C2/B2).

Nuestro próximo paso es calcular el orden de rango en orden ascendiente, pero de manera que el primer número de orden sea cero. Para eso usamos la fórmula
=JERARQUIA(D2,$D$2:$D$21,1)-1



He ordenado la lista de acuerdo a los resultados de JERARQUIA para hacer más evidente la técnica que vamos a emplear.

Como pueden ver, y como ya hemos explicado, el primer número de orden que tenemos es 6 (tenemos seis arqueros con el número de orden 0). Para nuestros propósitos queremos mantener los ceros, que identifican a los arqueros que estarán fuera del ranking, pero queremos que fuera de ellos los números de orden comiencen del 1.

Para esto anotamos en la columna F esta fórmula

=SI(E2=0,0,JERARQUIA(E2,$E$2:$E$21,1)-CONTAR.SI($E$2:$E$21,"<0")+CONTAR.SI($D$2:D2,D2)-1)


13-Nov-2006: la fórmula ha sido corregida gracias al aporte de Jaizki (ver comentarios)

Ahora generamos una tabla auxiliar para mostrar sólo aquellos arqueros que hayan jugado, ordenados de acuerdo al promedio de goles recibidos.

En el rango I1:K21 creamos esta tabla



Creamos tres nombres con rangos dinámicos (por si en el futuro queremos agregar más arqueros a la lista)

arqueros =DESREF(Hoja1!$A$2,0,0,CONTARA(Hoja1!$A:$A)-1,1)
jerarquia =DESREF(Hoja1!$F$2,0,0,CONTARA(Hoja1!$F:$F)-1)
promedio =DESREF(Hoja1!$D$2,0,0,CONTARA(Hoja1!$D:$D)-1)

En la celda J2 anotamos esta fórmula =INDICE(arqueros,COINCIDIR(I2,jerarquia,0)) y la copiamos al resto del rango.

En la celda K2 anotamos la fórmula =INDICE(promedio,COINCIDIR(J3,arqueros,0)) y la copiamos al resto del rango

El resultado es



Para ocultar los resultados N/A usamos formato condicional. En la ventanilla de Fórmula del diálogo de formato condicional escribimos



En la pestaña de Tramas, elegimos blanco para el color de la fuente; en la pestaña de borde elegimos la opción "ninguno".

El resultado es



El formato condicional ha vuelto "invisibles" a las líneas de la tabla donde la celda de la columna J da un resultado de error.

De esta manera, sólo usando fórmulas, hemos generado una tabla de ranking dinámica.





Categorías: Funciones&Formulas_,

Technorati Tags: