sábado, noviembre 18, 2006

Ingresar fechas en Excel sin separadores

A veces tenemos que entrar manualmente una larga lista de fechas en Excel. Para que Excel reconozca las entradas como fechas, tenemos que usar los separadores de fechas aceptados por Excel ("/", "-" o "." dependiendo de las definiciones del sistema).
Cómo hacemos para escribir fechas sin usar separadores, lo que nos permite agilizar el trabajo?

La idea es que entramos el número 18112006 en una celda y que Excel lo convierta en la fecha 18/11/2006 (día/mes/año).

Veamos las distintas posibilidades.

1 – Usando fórmulas

En este tipo de solución entramos el número en una celda y lo transformamos en fecha en una celda contigua.




En esta tabla, entramos los números en la columna A. En la columna B escribimos la fórmula
=SI(LARGO(A2)=8,FECHA(DERECHA(A2,4),EXTRAE(A2,3,2),IZQUIERDA(A2,2)),FECHA(DERECHA(A2,4),EXTRAE(A2,2,2),IZQUIERDA(A2,1)))

La fórmula básica es FECHA(DERECHA(A2,4),EXTRAE(A2,2,2),IZQUIERDA(A2,1))

Pero dado que el número del cual partimos puede tener 7 u 8 cifras, usamos la función SI.

La ventaja de este método es que los resultados de la fórmula son interpretados por Excel como fechas. Esto nos permite ordenar la lista en orden descendiente o ascendiente de acuerdo a las fechas.
La desventaja es que debemos agregar una columna a nuestro modelo.
También conviene notar que luego de las primeras cuatro entradas, Excel copia la fórmula en la columna B automáticamente.
Otra posibilidad es utilizar la funcionalidad Formulario del menú Datos, después de haber escrito la primer línea



Al usar Formulario Excel no sólo copiará las fórmulas, sino también los formatos.

2 – Usando formato personalizado

En el menú de formato de celdas elegimos la opción Personalizada. En la ventanilla Tipo anotamos lo siguiente:

##\/##\/####




El símbolo "\" lo usamos para forzar a Excel a exhibir "/" como separador en el formato.




Como pueden ver, en la barra de fórmulas aparece el número tal como lo entramos, 21102006, pero Excel lo exhibe en la celda de acuerdo al formato personalizado.

La ventaja de este método es que no hay necesidad de agregar una columna auxiliar a nuestro modelo.
La desventaja es que no podemos ordenar nuestra lista en orden creciente (o decreciente) de acuerdo a la fecha, ya que Excel no convierte nuestras entradas en fechas, como en el método anterior.

3 – Usando Eventos (macros).

Hasta ahora he tocado sólo tangencialmente el tema de las macros en este blog. Pero si queremos un método que reúna las ventajas de los dos anteriores, tenemos que echar mano a las macros (Vba).
Eventos son un tipo especial de macros que, como su nombre lo indica, entran en acción cuando sucede algún evento en el objeto al que se refieren.
En nuestro caso usaremos el evento Worksheet_Change ligado a la hoja de cálculos específica (que hemos llamado Evento).
Para acceder a este módulo apuntamos a la pestaña con el nombre de la hoja y con un clic del botón derecho del mouse abrimos el menú, donde seleccionamos Ver Código.
Otra posibilidad es abrir el editor de Vba (Alt+F11) y activar la hoja correspondiente en el panel Vba Project:



En el módulo de VBa copiamos esta rutina


Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngData As Range

Set rngData = Range("A2:A65536")

On Error Resume Next

If Union(Target, rngData).Address = rngData.Address Then

Application.EnableEvents = False

Target.ClearFormats

Select Case Len(Target)
Case 8
Target = DateSerial(Right(Target, 4), Mid(Target, 3, 2), Left(Target, 2))
Case 7
Target = DateSerial(Right(Target, 4), Mid(Target, 2, 2), Left(Target, 1))
Case Else
MsgBox "Entrada Incorrecta"
End Select

Application.EnableEvents = True

End If


On Error GoTo 0

End Sub


Este rutina hace que cada vez que escribimos algo en una celda del rango A2:A65536 (dejamos la celda A1 disponible para el encabezamiento de la columna), Excel evalúe si es un número de 7 u 8 cifras. De serlo, lo convierte en fecha tomando los últimas cuatro cifras par el año, las dos del medio para el mes y la primera o las dos primeras para el día.
La ventaja de este método es que usamos sólo una columna y que tenemos un control cuando ingresamos un número incorrecto.
La desventaja es que se requiere ciertos conocimientos de macros (Vba) para implementarlo.




Categorías: Varios_

Technorati Tags:

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: