lunes, febrero 01, 2010

Hipervínculos en Excel - cambiar ubicación

Excel permite crear hipervínculos en celdas tanto a páginas Web como a archivos. Como ya hemos visto, Excel nos proporciona dos caminos:



  • con el menú Insertar-Hipervínculo en Excel Clásico o Hipervínculo en la pestaña Insertar de Excel 2007 (o con el atajo de teclado Ctrl+Alt+K en ambas versiones de Excel o con el menú contextual)



Este último método tiene la ventaja de permitirnos crear ubicación del vínculo, es decir el texto con la ruta del archivo, en forma dinámica.

Con dinámica nos referimos a que en lugar de un texto fijo, ponemos una referencia a una celda que contiene el texto. De esta manera, podemos cambiar el texto en la celda y la referencia cambiará automáticamente.

Esta técnica puede ser muy útil en ciertas situaciones. Por ejemplo, si tenemos hipervínculos a varios archivos en una carpeta y por algún motivo debemos moverlos a otra carpeta. Los hipervínculos creados con el menú no son dinámicos y al mover los archivos dejarán de funcionar. En estos casos la solución será usar macros, que mostraremos más adelante.



En este ejemplo podemos ver que la ruta del archivo se crea combinando el valor de B1 con el nombre del archivo





De esta manera, si movemos el archivo a otra carpeta todo lo que tenemos que hacer es cambiar el valor de la celda B1.

Pero la vida, como siempre, nos enfrenta a situaciones más complicadas. Como el caso de uno de mis lectores que fue creando hipervínculos a archivos guardados en una carpeta y verse necesitado a moverlos a otra carpeta. Como los hipervínculos no fueron creados con la función, sólo tenemos dos alternativas: o cambiar cada vínculo manualmente o usar una macro.




Vamos a mostrar una macro sencilla para reemplazar la ruta de todos los hipervínculos en una hoja. En esta hoja hemos creado cuatro hipervínculos a archivos en la carpeta “D:\My Documents\temp”.



Si queremos cambiar la ruta a “D:\My Documents\blog” podemos usar esta macro

Sub hipervinc_cambio()

    Dim hpVinc As Hyperlink
    Dim strOldAddress As String, strNewAddres As String
  
    strOldAddress = "D:\My Documents\blog\"
    strNewAddres = "D:\My Documents\algodistinto\"
  
    For Each hpVinc In ActiveSheet.Hyperlinks
        hpVinc.Address = Replace(hpVinc.Address, strOldAddress, strNewAddres)
    Next
  
End Sub


Esta es una macro simplificada a los solos efectos de demostrar cómo cambiar los vínculos programáticamente.
En lugar de poner las rutas en el cuerpo del código podemos ponerlas en celdas de la hoja y modificar el código de acuerdo.
Por ejemplo podemos usar las celdas E1 y E2 para alojar el texto de la ruta




y usar esta rutina

Sub hipervinc_cambio()

    Dim hpVinc As Hyperlink
    Dim strOldAddress As String, strNewAddres As String
  
    strOldAddress = Range("E1")
    strNewAddres = Range("E2")
  
    For Each hpVinc In ActiveSheet.Hyperlinks
        hpVinc.Address = Replace(hpVinc.Address, strOldAddress, strNewAddres)
    Next
  
End Sub


viernes, enero 15, 2010

Cálculo de finalización de procesos con Excel

Supongamos que tenemos una planilla en Excel donde queremos calcular la fecha de finalización de un proceso a partir de la fecha de comienzo y la duración en días. Excel permite hacer esto con facilidad sumando el número de días a la fecha de comienzo




Pero si queremos calcular la fecha de finalización del proceso tomando en cuenta los feriados (el 16/01/2010 es sábado y el 17/01/2010 domingo), tendremos que usar la función DIA.LAB




El resultado aparece en rojo para resaltar el hecho que es incorrecto. El resultado correcto es



20/01/2010 08:00


Esto se debe a que DIA.LAB calcula días enteros, sin tomar en cuenta las horas, minutos y segundos.

Para calcular el resultado correcto usamos esta fórmula



=DIA.LAB(B5;C5)+(B5-ENTERO(B5))



Como ya hemos explicado en el pasado, Excel usa una serie de números para los cálculos de fechas. La parte entera del número representa el día y la parte decimal la fracción del día (horas, minutos y segundos).
En nuestro caso 15/01/2010 08:00 está representado por el número 40193,3333333333 donde 40193 son los días transcurridos desde el 1ro. de enero de 1900 y 0.333333 (es decir, 1/3) es la tercera parte del día, 8 horas (24 x 1/3 = 8)

Lo que hacemos en nuestra fórmula es extraer la parte decimal y agregarla al resultado de DIA.LAB.

Supongamos que la duración del proceso no es un número entero de días sino, por ejemplo, 3 días, 10 horas y 20 minutos. Si ignoramos los feriados podemos esta fórmula

=B9+C9+NSHORA(D9;E9;F9)



Usamos NSHORA para convertir los parámetros de tiempo que ponemos como números enteros en el número serial correspondiente al lapso (10:20:00 es representado por el número 0,430555555555556).

Si nos gusta complicarnos la vida o le tenemos antipatía a la función NSHORA, podemos usar en su lugar la expresión

=B10+C10+(D10*3600+E10*60+F10)/86400



Convertimos las horas y los minutos a segundos y los dividimos por 86400 que es la cantidad de segundos que hay en un día (24 x 60 x 60 = 86400)

En caso que tengamos que tomar en cuenta los feriados, tendremos que usar DIA.LAB y corregir el resultado tal como hicimos en el ejemplo anterior




miércoles, enero 06, 2010

Usos de Listas (Excel 2003) o Tablas (Excel 2007)

En Excel 2003 Microsoft introdujo una nueva funcionalidad: las listas. En Excel 2007 las listas evolucionaron en funcionalidad y eficiencia y pasaron a llamarse Tablas. Las Listas/Tablas son una de las funcionalidades más subestimadas por los usuarios de Excel.

En la nota anterior sobre rangos dinámicos vimos qué fácil es crearlos usando Listas o Tablas y cómo nos permiten sobreponernos a las limitaciones de la función INDIRECTO para crear listas desplegables dependientes.

En esto nota me extenderé sobre las otras bondades de esta funcionalidad.

Empecemos por la más trivial de las preguntas: ¿qué es una Lista/Tabla? Volvamos al ejemplo de la cadena de tiendas que mostramos en las notas sobre tableros de comandos (dashboards)






Las columnas F y G son índices que nos muestras las compras y la ganancia por cliente que calculamos con una sencilla operación aritmética.

La matriz B2:G6 es una rango rectangular de datos ordenados, pero aún no es una Lista /Tabla en términos de Excel. Para convertir este rango en una Tabla (Excel 2007), hacemos lo siguiente:

1 – seleccionamos alguna de las celdas del rango

2 – en la cinta activamos la pestaña Insertar y elegimos Tabla








3 – Seleccionamos el rango de la tabla y marcamos la opción “La tabla tiene encabezados”



4 – Excel convierte el rango seleccionado en una Tabla y abre la pestaña Diseño de Herramientas de tablas.

Como vimos en la nota anterior, aquí podemos darle un nombre significativo a la tabla




En Excel 2003 el proceso es similar, pero algo diferente



Las Tablas/Listas se diferencian de los rangos normales en, entre otras cosas:

  • al crear una Lista/Tabla Excel agrega automáticamente el Autofiltro
  • la Lista/Tabla se expande automáticamente al agregar una celda. Todas las referencias ligadas a la Lista/Tablas se adaptan al cambio automáticamente (gráficos, nombres, fórmulas)
  • al agregar valores a la Lista/Tabla, todas las fórmulas en columnas con fórmulas son copiadas automáticamente
  • si usamos la tecla TAB para navegar, Excel selecciona automáticamente la celda siguiente de izquierda a derecha y de arriba hacia abajo

Todo esto hace que el uso de Listas/Tablas sea muy eficiente para construcción de modelos dinámicos, en especial tableros de comandos.

Veamos algunos ejemplos. Vamos a agregar la sucursal 5 a nuestra base de datos



Primero hemos seleccionado la celda B6; luego nos movemos pulsando la tecla TAB (esto no es necesario en la vida real, pero quería demostrar cómo navegamos la tabla con TAB). Al alcanzar la celda G6 y pulsar TAB, Excel nos lleva automáticamente a la celda B7 y expande la tabla. Vemos que esto es cierto para el formato de las celdas y también para las fórmulas en las celdas F7 y G7.
Como todavía no hemos introducido datos, el resultado de las fórmulas es DIV/0. Al introducir los datos, vemos el error desaparece. Lo mismo sucede si copiamos/pegamos datos



Otra característica importante es la posibilidad de agregar una fila de totales al final de la Tabla. Esta fila se adapta automáticamente a los cambios en las dimensiones de la tabla Para agregar la fila de totales en Excel 2007 vamos a la pestaña de Herramientas de tabla y marcamos la opción Fila de Totales.

En nuestro caso, Excel pone el total sólo en la última columna con datos numéricos


Podemos ver que Excel ha agregado la función SUBTOTALES con la opción 109. Es decir que si filtramos la tabla, el resultado mostrará sólo el total de las filas visibles.

Podemos cambiar esta función por otras pulsando la flecha en el borde izquierda de la celda



Para poner totales en las otras columnas con valores numéricos seleccionamos la última celda de la columna lo que hace aparecer la flecha de opciones de totales