Mostrando las entradas con la etiqueta Tablas/Listas. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Tablas/Listas. Mostrar todas las entradas

jueves, octubre 06, 2011

Control de saldos de bancos con Excel.

Ariel me consulta cómo hacer para manejar en una única tabla los movimientos y saldos de varios bancos. Supongamos esta tabla



¿Cómo calculamos el saldo? Como prefiero usar una única fórmula para la columna propongo poner en la celda F2 ésta

=SUMA($D$2:D2)-SUMA($E$2:E2)

y copiarla a lo largo del campo



Préstese atención a las referencias semi-absolutas en los rangos de la fórmula.

El problema se nos presenta, obviamente, al filtrar la lista para ver los movimientos y el saldo de uno de los bancos



El saldo correcto es 2,495.00. Podemos solucionar esta situación usando SUBTOTALES. En F2 ponemos

=SUBTOTALES(9,$D$2:D2)-SUBTOTALES(9,$E$2:E2)

y la copiamos al todo el rango de la columna



SUBTOTALES suma sólo los valores de las celdas visibles, con lo que al filtrar el resultado será el correcto



Podemos mejorar notablemente nuestro modelo convirtiendo el rango de los datos en una “tabla” (o “lista” en Excel 2003).



Las tablas/listas tienen varias ventajas:


  • Formato automático
  • Las fórmulas en las columnas son copiadas automáticamente al agregar filas
  • La fila de totales
  • Actualización automática de todo objeto ( fórmulas, gráficos, tablas dinámicas) basados en la tabla



El archivo con el ejemplo se puede descargar aquí.

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 





domingo, noviembre 08, 2009

Agrupar y desagrupar filas en hojas protegidas

Ya en el pasado hemos hablado de la funcionalidad Datos--Subtotales en Excel. Esta funcionalidad tiene un serio problema: no funciona si la hoja está protegida.
Supongamos esta tabla de ventas por mes y sucursal



agrupar en hojas protegidas

Después de aplicar Datos-Subtotales, la tabla se ve así



agrupar en hojas protegidas

Apretamos el botón del nivel 2 y veremos la tabla de esta manera




agrupar en hojas protegidas

Ahora protegemos la hoja marcando todas las posibilidades de permiso



agrupar en hojas protegidas

Si intentamos desplegar algún mes para ver el detalle o cambiar el nivel de agrupamiento, veremos esta nota

agrupar en hojas protegidas

Es decir, Excel no tiene una opción para permitir agrupar o desagrupar líneas en una hoja protegida.

Una solución obvia es desproteger la hoja antes de efectuar el cambio. Pero esto puede contradecir nuestra intención (que el usuario no pueda modificar los datos en la hoja).


La solución consiste en proteger la hoja programáticamente, es decir, con una macro. En este caso se trata de un evento WorkBook_Open y el código lo ponemos en el módulo del objeto ThisWorkbook

Private Sub Workbook_Open()
    With Worksheets("Hoja1")
        .EnableOutlining = True
        .Protect Password:="", _
        Contents:=True, UserInterfaceOnly:=True
    End With
End Sub


agrupar en hojas protegidas


En este código hemos dejado la contraseña en blanco (.Protect Password:=""), lo que permite al usuario quitar la protección. Si queremos agregar la contraseña la pondremos entre las comillas.
Como hemos usado el evento Workbook_Open, cada vez que se abre el cuaderno la protección entra en efecto.


De esta manera hemos bloqueado las celdas protegidas, pero permitimos a nuestros usuarios agrupar y desagrupar las líneas.



Technorati Tags:



viernes, junio 12, 2009

Rangos dinámicos con Listas

Una tarea frecuente en Excel es crear rangos dinámicos. La técnica más difundida es crear un nombre (Insertar-Nombres-Definir) con una fórmula que combine DESREF y CONTARA.

Una técnica alternativa más sencilla es usar Listas (Excel 2003) o Tablas (Excel 2007). Esta funcionalidad es muy útil y permite simplificar nuestros modelos en Excel.

En una nota anterior mostramos como crear con facilidad un gráfico dinámico usando Listas. En esta nota mostraremos cómo crear un modelo dinámico.

Como ejemplo construiremos un modelo para manejar el inventario de un almacén/depósito. En un cuaderno Excel creamos dos hojas: “movimientos” y “saldos”. En la primera anotamos los movimientos de los productos en el almacén (entradas – salidas); en mostramos los saldos actualizados de los productos.



Rangos dinámicos con Listas

En la hoja “movimientos” tenemos ahora un cuadro de datos en el rango A1:D31. Para transformar este rango en Lista, usamos el menú Datos-Lista (o Ctrl+Q)

Rangos dinámicos con Listas


Rangos dinámicos con Listas

Al apretar Aceptar veremos que Excel selecciona todo el rango, activa Autofiltro y en la primer fila libre aparece un asterisco azul. A partir de este momento, cada vez que agreguemos datos a la lista, ésta se expandirá automáticamente.

En la celda A1 de la hoja “saldos” combinamos texto y funciones para crear un título dinámico
Rangos dinámicos con Listas

="Saldos a la fecha "&TEXTO(MAX(movimientos!C2:C31),"dd/mm/yyyy")

Como pueden ver usamos una referencia estática al rango de las fechas en la hoja “movimientos”.
Para calcular los saldos actualizados usamos la fórmula

=SUMAR.SI(movimientos!$A$2:$A$31,saldos!A4,movimientos!$D$2:$D$31)
Rangos dinámicos con Listas

También aquí usamos rangos “normales”.

Ahora agregamos los movimientos del día 08/01/2009

Rangos dinámicos con Listas

Cuando pasamos a la hoja “saldos” vemos que tanto el título como los saldos se han actualizados. Así de simple!

Rangos dinámicos con Listas

En Excel 2007, el mecanismo es similar, pero la funcionalidad Lista ha pasado a llamarse Tabla. Para convertir un rango en Tabla usamos el icono Tabla en la pestaña Insertar

Rangos dinámicos con Listas

Tanto en Excel 2003 como en Excel 2007, la forma más cómoda y eficiente de agregar datos en la lista/tabla, es usando Tab.



Technorati Tags:

sábado, enero 26, 2008

Programación de Eventos en Excel - Primera Nota

En mi nota sobre cómo crear un numerador automático para factura en Excel mostraba el uso de eventos en esta tarea. Ya en notas anteriores había mostrado o mencionado el uso de esta herramienta y también prometido que escribiría una nota sobre el tema. Aquí está la nota.

Debemos distinguir entre eventos y programación de eventos. Evento es, como su nombre lo indica, algo que ocurre en Excel. Programar un evento significa que hemos escrito una rutina que será ejecutada cuando ocurra el evento.

Excel monitorea constantemente lo que ocurre en la aplicación. Cuando existe un código asociado a un evento, este es disparado al darse las condiciones del evento.

Por ejemplo, en la nota mencionada más arriba, hacíamos uso del evento BeforePrint. A este evento le habíamos asociado una macro que colocaba un número consecutivo cuando el usuario decidía imprimir la factura.
En ese ejemplo el evento es iniciado por el usuario. Eventos pueden ser iniciados también por macros.

Existen eventos para casi todos los objetos de Excel. Podemos clasificar los eventos de la siguiente manera:

  • Eventos del cuaderno (Workbook events): responden a acciones en un cuaderno en particular. Por ejemplo Workbook_Open, que ocurre cuando abrimos un cuaderno.


  • Eventos de las hojas (Worksheet events): responden a acciones en una hoja en particular. Por ejemplo Worksheet_Calculate, que ocurre cuando la hoja es recalculada.


  • Eventos de gráficos (Charts events): responden a acciones en un gráfico en particular.


  • Eventos de la aplicación (Application events): responden a acciones a nivel de la aplicación (es decir, Excel). Un ejemplo es WorkbookBeforeClose, que ocurre cuando iniciamos el proceso de cerrar un cuaderno.


  • Eventos de formularios/controles (Userform events): por ejemplo, el botón de la barra de formulario tiene un evento Button_Click.



Existen distintas formas de investigar qué eventos existen para cada objeto. Por ejemplo, al poner un botón de la barra de formularios en una hoja de Excel se abre el diálogo Asignar macro




Si apretamos Aceptar, Excel abrirá el editor de Vb con una rutina Botón2_AlHacerClic() sin líneas.



Si escribimos esta macro



cada vez que apretemos el botón ("al hacer clic"), el valor de la celda C1 se incrementa en 1.

En este caso la macro está ubicada en un módulo corriente. Más adelante veremos que no siempre es así.

Hay varias formas de investigar qué eventos existen para cada objeto. Por ejemplo, podemos usar el Examinador de Objetos (en el editor de Vb, apretar F2). En la ventana Clases elegimos el objeto que queremos investigar (Worksheet en nuestro caso) y en la ventana Miembros de Worksheet nos deslizamos hasta que vemos nombres con un rayo amarillo a la izquierda



Esto nos permite ver los eventos disponibles para la hoja.

Otra forma es seleccionar el objeto en la ventana Explorador de proyectos con un doble clic. Si hacemos esto con la Hoja1, se abre un módulo especial asociado con esta hoja. Abrimos la lista de la ventanilla donde aparece General



y elegimos Worksheet. Excel pone automáticamente una Sub Worksheet_SelectionChange(ByVal Target As Range) sin líneas. Ahora podemos abrir la lista de la ventanilla de los eventos y elegir alguno de ellos



Señalemos que los nombres y los parámetros de los eventos están predeterminados y no deben ser cambiados.

Veamos ahora algunas técnicas útiles. Queremos que cada vez que el usuario abre un determinado cuaderno aparezca un mensaje que le recuerde realizar cierta tarea. Obviamente, este evento pertenece al libro (Workbook). En el editor de Vb, apretamos el icono ThisWorkbook y elegimos el evento Open. Escribimos una rutina como ésta



Guardamos el cuaderno. Al abrirlo, veremos el mensaje



Varios de los eventos de la hoja tienen una variable llamada Target. De acuerdo al evento, esta variable está definida como Rango, como en el evento Change


Sub Worksheet_Change(ByVal Target As Range)

o como enlace (Hyperlink)

Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

e inclusive como tabla dinámica

Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable).

En el caso de rangos, Target se refiere a cualquier celda de la hoja. Por eso, cuando trabajamos con alguno de estos eventos, surge la necesidad de definir cuál es el rango relevante.
Supongamos que en una hoja tenemos un rango llamado Ventas, B2:B13. Queremos que cada vez que el usuario ingrese las ventas de un mes, aparezca un mensaje que le muestre el total acumulado. Esto significa que el evento debe reaccionar cuando cambian los datos en el rango.
En este caso usamos el evento Change, al que le asociamos este código

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rngVentas As Range, vntTotal As Double

  Set rngVentas = Range("Ventas")
  vntTotal = WorksheetFunction.Sum("Ventas")

    If Union(Target, rngVentas).Address = rngVentas.Address Then
      MsgBox "Tottal acumulado de ventas " & vntTotal
    End If

End Sub

Cada vez que ingresamos un dato en el rango B2:B13, recibiremos un mensaje como este



La clave en esta rutina es el uso de la función Union. Esta función evalúa si la dirección de Target (la celda activa donde introducimos el dato) coincide con alguna de las direcciones del rango Ventas. En caso afirmativo, se dispara el evento que calcula el total y muestra el mensaje.
En la línea Set rngVentas = Range("B2:B13") es más conveniente usar la sintaxis Set rngVentas = Range("ventas"), usando el nombre definido "Ventas".

En la próxima nota tocaremos otros aspectos de los eventos, como jerarquía de eventos, cómo evitar "loops" y agregaremos algunos ejemplos más.


Technorati Tags: