lunes, febrero 27, 2006

Más sobre referencias dinámicas en Excel - uso de INDIRECTO

Cuando hablamos de referencias dinámicas nos referimos a situaciones en las cuales una hoja de Excel refleja resultados en base a otra hoja (en el mismo o en otro cuaderno).
Excel nos provee de muchas herramientas para construir estas referencias dinámicas. Las más conocidas tal vez sean BUSCARV (VLOOKUP en su versión inglesa), su variante BUSCARH (HLOOKUP), INDICE (INDEX) y COINCIDIR (MATCH).
En esta nota voy a hablar sobre una función poco utilizada por lo general: INDIRECTO.
La ayuda de Excel describe esta función de la siguiente manera:

Devuelve la referencia especificada por una cadena de texto. Las referencias se
evalúan de inmediato para presentar su contenido. Use INDIRECTO cuando desee
cambiar la referencia a una celda en una fórmula sin cambiar la propia formula.

Lo que en castellano quiere decir: dada una referencia a una celda en forma textual, use INDIRECTO para recibir el valor que contiene esa celda.

Veamos un ejemplo (El archivo del ejemplo se puede descargarindirecto2aqui). Supongamos un cuaderno Excel con una hoja para mes de ventas. Cada hoja tiene el nombre del mes.





Los datos en cada hoja están organizados de la siguiente manera: productos en la columna A, ventas en la columna B



Por cada mes agregamos una hoja al cuaderno. En la primer hoja tenemos una fórmula que nos muestra el total de ventas de acuerdo al mes que elijamos



Cómo hacemos esto? Como pueden ver hemos usado
Validación de datos para crear una lista de meses.

En la celda B2 escribimos la fórmula =SUMA(INDIRECTO(A2&"!B:B"))

Al elegir un mes en la celda A2, la expresión (A2&"!B:B") se transforma en el texto enero!B:B. Al utilizar este texto como argumento para la función INDIRECTO, Excel lo convierte en una referencia al rango B:B de la hoja "enero", que a su vez se transforma en el argumento de la función SUMA.
Ahora cada vez que elijamos un mes en la celda A2, veremos el total de ventas del mes elegido en la celda B2.



Categorías: Funciones&Formulas_, LOOKUPS_


Technorati Tags: ,

viernes, febrero 24, 2006

Uso de NOMBRES (NAMES) en Excel – Validación de Datos

En una nota anterior he hablado de las ventajas de usar NOMBRES en Excel. Hemos mostrado que los NOMBRES no sólo pueden servir para identificar rangos (lo que he llamado "nominar" rangos) sino que también pueden contener fórmulas.
Una demostración sobre este tipo de uso de NOMBRES puede verse en esta nota sobre Formato Condicional, y también en esta nota sobre valores #N/A.
Hoy veremos otro uso de como esta funcionalidad nos permite sobreponernos a algunas limitaciones de Excel.
En muchos de los modelos que desarrollo para mis clientes uso Validación de Datos. Esta funcionalidad permite controlar el tipo de datos permitidos.





Por ejemplo podemos establecer que sólo valores enteros entre 10 y 100 sean válidos para un rango determinado.



La variante que yo utilizo en muchos de mis modelos es "Lista"



Cuando usamos esta variante, en cada celda del rango se abre una lista de valores de la cual. Cualquier valor que no figure en la lista no será aceptado por Excel.

El problema con esta variante reside en que Excel aceptará solamente listas que sen encuentren en la misma hoja de la celda que queremos formar. Por ejemplo, no podemos usar una lista que se encuentre en Hoja2 para formar las celdas en Hoja1.
La solución es definir el rango de la lista como NOMBRE. Veamos esto con un ejemplo.
Supongamos que en Hoja2 tenemos una lista de precios:


Y en Hoja1 un formulario para calcular ofertas:



La idea es utilizar Validación de Datos para generar una lista de la cuál se elegirán los productos. El problema, como ya dijimos, es que Excel no permite utilizar rangos que se encuentren en otras hojas. Y nuestra lista de precios se encuentra en la Hoja2.

Para solucionar este problema hacemos lo siguiente:
1 – entramos en la hoja dos y seleccionamos el rango con los números de catálogo de los productos. En el cuadro nombres introducimos el nombre "productos".


2 – En la Hoja1 seleccionamos el rango A7:A12 y entramos en el menú de Validación de Datos. Elegimos la opción "lista".



3 – Pulsamos la ventanilla "origen" e inmediatamente el botón F3, lo que nos permitirá elegir uno de entre los nombre que hemos creado. Elegimos "producto" y pulsamos "aceptar".



4 – A partir de este momento cada vez que seleccionemos una celda en el rango A7:A12, veremos un pequeño triángulo. Si pulsamos este triángulo se abriera una lista que refleja los productos que se encuentran en la Hoja2.



En las celdas del rango B7:B12 utilizamos la fórmula


=SI(ESBLANCO(A7),"",BUSCARV(A7,lista_de_precios,2,0))

de esta manera, cuando elegimos una valor de la lista, automáticamente aparecerá el precio correspondiente.


Como ven, también hemos creado un NOMBRE que contiene el rango A2:B12 en la Hoja2, es decir el catálogo de productos con sus precios.
La función ESBLANCO nos sirve para evitar valores #N/A cuando no hay números de catálogo en la columna A de la Hoja1.



Categorías: Funciones&Formulas_, Manejo de Datos_, Varios_


Technorati Tags:
,

martes, febrero 21, 2006

Reemplazando la tilde "~" con "Texto en Columnas" en MS Excel

Hoy vino Norman, compañero de trabajo, a verme con el siguiente problema. En una tabla de Excel hay una lista de cuentas contables con la siguiente forma: 11~2222~3333~44444. Por algún motivo había que reemplazar el tilde "~" por el símbolo "-". Sencillo, no? Todo lo que hay que hacer es apretar Ctrl+L (o Ctrl+H, si tienen la versión inglesa), y reemplazar le tilde por el guión.




Como ven, Excel se niega a reconocer la tilde. Si presionan "buscar" en lugar de "reemplazar", Excel los llevará a la última celda de la hoja (IV65536). No tengo claro por qué sucede esto, pero mi amigo tenía que realizar su tarea así que había que encontrar una solución (la lista contenía más de 5000 cuentas).
Este problema se puede resolver de varias maneras, incluido escribir una función UDF. Pero la solución más sencilla es utilizar el menú Datos--->Texto en Columnas



Estos son los pasos:
1 – Seleccionar el rango y abrir el menú Datos--->Texto en Columnas



2 – elegir la opción "delimitados", pulsar "siguiente"; en la casilla "otro" poner la tilde "~".



3 – Pulsar "finalizar". Excel pone cada grupo de número en una columna.



4 – Ahora tenemos que "rearmar" el número, para lo cual usaremos el operador "&". La fórmula será la siguiente =A2&"-"&B2&"-"&C2&"-"&D2



5 – Antes de eliminar las columnas innecesarias, convertimos las fórmulas en la columna E en números (Edición--->Pegado Especial--->Valores)




Categorías: Manejo de Datos_, Varios_

Technorati Tags:


lunes, febrero 20, 2006

Usar Nombres en Excel para Formato Condicional

Ayer hablamos sobre el uso de "nombre" en Excel. En esa nota decía que el uso de nombres nos permite realizar operaciones que de otra manera no serían posibles.
Veamos un ejemplo. Una de las funcionalidades que empleo a menudo en mis modelos es el "Formato Condicional".





Un ejemplo puede verse en esta nota sobre comparación entre dos listas. En ese ejemplo usamos una fórmula para condicionar el formato.
Ahora supongamos que queremos condicionar el formato de una celda de acuerdo al resultado de una celda que se encuentra en otra hoja. En este ejemplo tenemos en la Hoja1 los totales de ventas para el primer trimestre del año de nuestros agentes de ventas.

En la Hoja2 tenemos las ventas por mes y por agente


Para verificar que no falten datos mensuales queremos hacer un formato condicional en la Hoja1 que de un fondo rojo cuando falte algún dato de ventas de algún agente. Para hacer esto tenemos que detectar si hay alguna celda vacía en el rango B2:D6. La forma de verificar esto es con la función CONTAR. Por ejemplo, si CONTAR(B2:D2) da un resultado menor de 3, señal que falta algún dato. Ahora lo que tenemos que hacer es aplicar un formato condicional en la celdas con los nombre de los agentes, de manera que si falta algún dato reciban un fondo rojo.

Como veremos Excel no nos permitirá hacer esto:
Seleccionamos la celda A2 en la Hoja1, entramos en el menú Formato--->Formato Condicional



En al ventanilla de la condición escribimos la formula =CONTAR(Hoja2!B2:D2)<3>





Elegimos la trama roja, pero cuando apretemos "aceptar" recibiremos esta nota

Excel no nos permite usar referencias a otras hojas en el formato condicional.

La forma de superar este problema es usando nombres. Veamos primero la variante sencilla. Seleccionamos la Hoja2, seleccionamos el rango B2:D2 y en el cuadro de nombres escribimmos el nombre "agente1".

Ahora volvemos a la Hoja1, abrimos el menú Formato--->Formato Condicional, pero usaremos la fórmula =CONTAR(agente1)<3>

Como pueden ver, Excel acepta esta notación y podemos ver que para el Agente 1 nos faltan datos de ventas en la Hoja2.

Una variante un poco más compleja es incluir toda la fórmula en el nombre:

Esta misma técnica la podemos utilizar para superar un problema similar que existe en la Validación de Datos. Tampoco aquí Excel permite referencias a otras hojas, excepto que estas referencias estén incluidas en nombres.


Categorías: Funciones&Formulas_, Manejo de Datos_



Technorati Tags:,

sábado, febrero 18, 2006

Uso de Nombres (NAMES) en MS Excel

En varias de mis notas anteriores he mencionado el uso de "nombres" en la composición de fórmulas. En este contexto he utilizado "nombres" para señalar rangos o celdas (en definitiva, una celda es un rango de una sola celda).
En cuanto descubrí esta funcionalidad que ofrece Excel comencé a utilizarla profusamente, y siempre me ha llamado la atención que usuarios de nivel intermedio e inclusive alto, no la empleen. Así que vamos a hablar un poco sobre el uso de nombres en Excel.
Por lo general hablamos de rangos nominados ("named ranges" en inglés) pero enseguida veremos que los nombres en Excel son en realidad otra cosa.

El ejemplo más sencillo es de este tipo: en una Nombres1hoja de Excel tenemos una tabla con las ventas mensuales de un agente; en alguna otra celda tenemos el porcentaje de comisión que le corresponde:


En lugar de calcular la comisión que le corresponde a nuestro agente con la fórmula =SUMA(B2:B13), podemos nominar el rango B2:B13 como "ventas" y la celda B15 "porcentaje". Nuestra fórmula se verá entonces: =SUMA(ventas)*porcentaje. En este ejemplo sencillo las ventajas de usar nombres no parecen gran cosa, pero imagínense una fórmula complicada con referencias a otras hojas. Esta forma "auto-explicatoria" de escribir las fórmulas puede ser de gran ayuda. Y esto no es todo, pero las demás ventajas las veremos más adelante.
Hay varias formas de crear nombres. La más sencilla es usar el "cuadro de nombres"



La técnica es sencilla: primero marcamos el rango, luego escribimos el nombre en el cuadro de nombre y pulsamos Enter.



Hacemos lo mismo con la celda B15, y ya podemos escribir nuestra fórmula con nombres:



Para ver cómo interpreta Excel los nombres, abrimos el menú Insertar--->Nombre--->Definir



Aquí podemos ver que la definición del rango va precedida por un signo "=": =Hoja1!$B$2:$B$13, lo que nos dice que Excel interpreta los nombres como fórmulas y no precisamente como rangos. Por ejemplo, podemos crear un nombre que se llame "total_de_ventas" cuya definición es =SUMA(Hoja1!$B$2:$B$13). Podemos entonces rescribir la fórmula en la celda B16 de la siguiente manera: =total_de_ventas*porcentaje



Esto es muy importante porque podemos definir no solo rangos sino también fórmula los que nos permitirá hacer algunos "pases mágicos". Estos serán el tema de mi próxima entrada.

Por ahora me queda sólo agregar que no se pueden borrar nombres en el cuadro de nombres, como parecería lógico pensar. Para borrar nombres hay que activar el menú Insertar--->Nombre--->Definir, elegir el nombre que queremos borrar y pulsar el botón "Eliminar".
En la próxima entrada veremos cómo usar nombre para crear rangos dinámicos y como crear listas para validación de datos.



Categorías: Funciones&Formulas_, Varios _

Technorati Tags: ,

viernes, febrero 17, 2006

Sumar y contar con varias condiciones en Excel:SUMAR.SI, CONTAR.SI y SUMAPRODUCTO

El tema de hoy: sumar y contar con más de una condición. Ya he escrito sobre este tema, pero mi intención hoy es dar una idea general del método.
Excel ofrece dos funciones para sumar o contar condicionadamente: SUMAR.SI (SUMIF en la versión inglesa) y CONTAR.SI (COUNTIF). Estas funciones aceptan sólo una condición y su uso es sencillo.



La cuestión es cómo sumar o contar cuándo deben cumplirse varias condiciones.
Veamos un ejemplo sencillo de contar con una condición. Tenemos una lista de nombres, sexo y edades, y queremos saber cuántas personas hay en la lista mayores de 30 años.



Como pueden ver, la formula en la celda C13 es bien sencilla: =CONTAR.SI(C2:C11,">30")

Pero digamos que ahora queremos saber cuántas personas mayores de 30 años y de sexo masculino hay en la lista. La función CONTAR.SI no acepta dos condiciones. La solución es utilizar fórmulas matriciales o SUMAPRODUCTO como ya he mostrado.
Cómo funciona esto? Cuando Excel evalúa una expresión de tipo A1= B1 puede dar uno de dos resultados: FALSO (FALSE en inglés) o VERDADERO (TRUE). Falso está asociado con la cifra 0 (cero) y VERDADERO con el 1 (uno).
Cuando establecemos la condición "mayor de 30" Y "masculino", la palabra Y está asociada a la operación de multiplicar.
Como ejemplo, he escrito en el rango de celdas D2:D11 la fórmula =Y(C2>30,B2="masculino")



Ahora he agregado en el rango E2:E11 la formula =(C2>30)*(B2="masculino")



Como se puede ver, si sumamos todo el rango E2:E11 obtendremos el resultado 2, que es el número de personas que cumplen con las dos condiciones.
En lugar de efectuar la operación en dos etapas, primero evaluar cada miembro y luego sumar los resultados, podemos hacerla de una vez usando la función SUMAPRODUCTO de esta manera:

=SUMAPRODUCTO(((C2:C11)>30),((B2:B11)="masculino"))


la multiplicación por 1 dentro del paréntesis se hace para convertir los valores FALSO y VERDADERO a valores numéricos (0 y 1).

Otra alternativa es usar la función SUMA en una fórmula matricial, esto es, ingresándola apretando al mismo tiempo Control+Shift+Enter.


La fórmula es: ={SUMA(((C2:C11)>30)*((B2:B11)="masculino")*1)}



De esta manera podemos combinar varias condiciones que deben cumplirse simultáneamente.

En el caso de condiciones incluyentes, digamos, personas mayores de 40 o menores de 30, usaremos el operador "+" (sumar) en ligar de "*" (multiplicar):

={SUMA((((C2:C11)<30)+((c2:c11)>40))*1)}





Categorías: Funciones&Formulas_, Formulas Matriciales_

martes, febrero 14, 2006

Usar ELEGIR (CHOOSE) en lugar de SI (IF) en MS Excel

En esta nota he hablado sobre la capacidad de Excel de combinar funciones. Una de las combinaciones más usuales que veo, es con la función SI (IF en la versión inglesa). La función SI nos permite efectuar cálculos de acuerdo a ciertas condiciones. Y cuando hay una cadena de condiciones, entonces creamos una cadena de funciones SI en nuestra fórmula.
El problema con esta técnica es que terminamos creando "fórmulas chorizo" que, diez minutos después de haberlas escrito, no somos capaces de descifrar.
Esto es lo que le pasó a mi amigo Daniel. Describamos la situación de mi amigo de la siguiente manera:
Después de haber realizado unos experimentos anotamos los resultados en una hoja de Excel. Estos resultados pueden ser positivos o negativos. De acuerdo a esto debemos efectuar una operación de suma con los resultados. El cuadro es el siguiente, tres pruebas (test 1, test 2, test 3) y cinco posibilidades (pueden bajar el cuaderno con las fórmulas )





Mi amigo empezó a escribir una fórmula que combinaba (nesting) funciones SI (IF) y funciones Y(AND). La idea era escribir una única fórmula compacta, de acuerdo al famoso dicho de Gracián que lo bueno si breve, dos veces bueno.
Después de tres horas de enconada lucha con Excel y ya al borde de una crisis nerviosa, me llamó para que le ayudara.
Mi consejo fue, que si bien hay cierta sabiduría en lo de Gracián, mi abuelita también decía que si el atajo fuera bueno, no existirían los caminos. Así que le recomendé ir por el camino más largo que significa dividir la fórmula en varias fórmulas intermedias.
Paso a explicar. Para lograr en una única fórmula resolver el intríngulis de mi amigo debemos descerrajar semejante fórmula:

IF(AND(B2>0,B3>0,B4>0),B2-B3-B4,IF(AND(B2>0,B3<0,b4>0),B2+B3-B4,IF(AND(B2>0,B3>0,B4<0),b2-b3+b4,if(and(b2>0,B3<0,b4<0),b2+b3+b4,0))))

He aquí el resultado

Mi propuesta fue crear fórmulas que indicaran la situación de los resultados y usarlas como argumentos en una función ELEGIR (CHOOSE en inglés), la que muchas veces es un buen sustituto de la función SI (IF). En las celdas al lado del cuadro de condiciones hemos agregados unas fórmulas que nos indican la relación entre los resultados. Estas fórmulas combinan la función SI con la función Y (AND en la versión inglesa). Cada relación recibe un número de orden. Si la relación se cumple, la función muestra el número de orden (1, 2, 3, o 4), caso contrario el resultado será 0.

En la celda F8 escribimos la siguiente fórmula ELEGIR(SUMA(control),B2-B3-B4,B2+B3-B4,B2-B3+B4,B2+B3+B4,0) que como verán es mucho más compacta que la anterior. El resultado será, por supuesto, el mismo

Esta técnica nos permite un mayor control de la lógica de nuestras fórmulas y el consecuente ahorro de tiempo. Y como decíamos al principio, no siempre el camino más corto es el más rápido.



Categorías: Funciones&Formulas_, LOOKUPS_