martes, diciembre 02, 2014

Totalizar datos en Excel con Datos-Consolidar

Uno de los métodos con los que cuenta Excel para consolidar datos de distintas hojas o cuadernos es Datos-Consolidar (pueden ver esta prehistórica nota en el blog o apretar el enlace Consolidar Datos en la nube de etiquetas).
También podemos usar este método para consolidar rápidamente los datos de una tabla. Supongamos que tenemos una tabla de 1000 filas que detalla las ventas del mes de noviembre. Dado que cada venta se anota por separado, cada fecha del mes aparece varias veces. Nuestro objetivo es totalizar las ventas por día (si, por supuesto que podemos hacerlo con una tabla dinámica; pero aquí mostraremos como hacerlo con Datos-Consolidar),

Supongamos que las ventas están en el rango A1:B1001; el primer paso será definir un nombre que se refiera a este rango. Seleccionamos el rango y introducimos el nombre en la cuadro de nombres


El próximo paso es seleccionar una celda, en la misma hoja o en la hoja donde queremos que aparezcan los datos totalizados, y activar el menú Datos-Consolidar


Nos aseguramos que la función sea "Suma", en la referencia pegamos el nombre que se refiere al rango de los datos (podemos usar F3 para pegar el nombre) y marcamos las opciones "Fila superior" y "Columna izquierda" en la opción "Usar rótulos". Finalmente apretamos Aceptar


Excel crea instantáneamente una tabla totalizando las ventas por fechas.

Detalles a tener en cuenta:

  • Excel no pone el encabezamiento en la primer columna (la celda D2 en nuestro ejemplo), por lo que debemos agregarla manualmente;
  • en la tabla de totales las fechas aparecerán con formato General, por lo que debemos aseugrarnos de pre-formar el rango de las celdas o hacerlo después de crear la tabla.

jueves, noviembre 27, 2014

Señalar series por color en gráficos de Excel

Supongamos esta situación:


Hemos representado en el gráfico una serie de valores que pertenecen a tres grupos (en la "vida real" podría tratarse de ventas de grupos de productos o de salarios de grupos de trabajadores, etc.).
Lo que queremos es representar cada grupo con un color distinto. Por defecto, Excel da a todos los puntos de una serie el mismo color. Podríamos cambiar el color de la columna de cada punto manualmente, pero podemos con hacerlo fácilmente usando la técnica que mostraré a continuación (y que ya he mostrado en alguna nota en el pasado).

El truco consiste en descomponer la única serie en tres series, una para cada grupo. Lo hacemos creando tres columnas auxiliares

En este ejemplo me he limitado a copiar los valores del grupo 1 a la columna D, los del grupo 2 a la columna E y los del grupo 3 a la columna F.
Para crear el nuevo gráfico seleccionamos el rango B2:B11 e inmediatamente, apretando y manteniendo apretada la tecla Ctrl. el rango D2:F11; seleccionamos Insertar-Gráfico-Columna, y obtenemos


Excel otorga automáticamente un color distinto a cada serie. Por supuesto podemos ocultar las columnas auxiliares o ponerlas en un rango oculto.

Mis perspicaces lectores habrán notado que existe un problema con las etiquetas del eje de las categorías (el eje de las X). Estas están alineadas a la izquierda, coincidiendo con el primer valor de cada grupo, cuando lo que quisiéramos es que estuvieran en el centro del grupo.

Para obligar a Excel a centrar los rótulos del eje agregamos una columna a nuestra tabla, entre las columna B y C; esta columna contiene un espacio (no está vacía, sencillamente seleccionamos la celda, apretamos la tecla de espacios e inmediatamente Enter)




lunes, noviembre 24, 2014

Agregar controles en una hoja de Excel usando Vba

Los controles (casillas de verificación, cuadros combinados, botones de opción, etc.) dan un "toque profesional" a la hoja pero no siempre son la mejor opción. En  general podemos encontrar soluciones más prácticas usando, por ejemplo, validación de datos y/o funciones SI.

Lo más corriente es agregar controles en la hoja en forma manual, usando el menú Desarrollador-Controles-Insertar. Existen dos colecciones de controles: Formulario y ActiveX.
En esta nota veremos como insertar controles ActiveX usando Vba.

Supongamos esta tabla de facturas con sus fechas de vencmientos


En el campo "Pagada" (columna E) anotamos "SI" cuando la factura ha sido pagada. Esto nos permite crear el informe que nos muestra los totales de facturas atrasadas, pagadas y a vencer.
Las fórmulas en el informe son:

celda H4:

=SUMAPRODUCTO((tblFacturas[Fecha Vencimiento]<H3)*(tblFacturas[Pagada]<>"SI")*tblFacturas[Importe])


celda H5:

=SUMAR.SI(tblFacturas[Pagada],"SI",tblFacturas[Importe])


celda H6: 

=SUMAPRODUCTO((tblFacturas[Fecha Vencimiento]>=H3)*(tblFacturas[Pagada]<>"SI")*tblFacturas[Importe])


la Tabla "tblFacturas" se refiere al rango B2:E16 (supongo que la mayoría de mis lectores ya hayan adoptado la sana costumbre de usar Tablas para organizar matrices de datos).

Y ahora vayamos a la cuestión de los controles incrustados en hojas de Excel. En nuestro ejemplo queremos usar casillas de verificación para señalar que una factura ha sido pagada  en lugar de un "plebeyo" SI.

Queremos que nuestro informe se vea así:


Si nuestra tabla tiene pocas filas podemos simplemente agregar los controles manualmente. Las casillas están definidas sin texto, ligadas a ka celda sobre la cual están ubicadas y el valor es FALSO. Todo esto tenemos que definirlo cambiando las propiedades por defecto de la casilla. Para ahorrarnos el trabajo de hacerlo cada vez que queremos agregar una casilla podemos usar esta macro:

Sub insert_one()
   
    With ActiveSheet.OLEObjects.Add(classtype:="Forms.Checkbox.1", _
         Top:=ActiveCell.Top + 1, Left:=ActiveCell.Left + 15, _
         Height:=ActiveCell.Height, Width:=ActiveCell.Width * 0.5)
         .Object.Caption = ""
         .LinkedCell = ActiveCell.Address
         .Object.Value = False
         .Object.BackStyle = fmBackStyleTransparent
     End With
    
End Sub


El código agrega la casilla de verificación en la celda (con el método Add); luego definimos algunas propiedades:
Caption = "" para que la casilla no contenga ningún texto;

LinkedCell = Activecell.Address para ligar la casilla a la celda; esto es necesario para poder luego utilizar el valor de la casilla en nuestras fórmulas.

Value = False para que éste sea el valor por defecto en la celda vinculada a la casilla de verificación.

En la tabla de las facturas cambiamos el color de la fuente en las celdas de la columna Pagadas a blanco, para que el valor de la casilla en la celda vinculada no sea visible.

Dado que en el campo Pagada tenemos ahora valores FALSO o VERDADERO (cuando la casilla a sido marcada), tenemos que modificar nuestras fórmulas

celda H4:

=SUMAPRODUCTO((tblFacturas3[Fecha Vencimiento]<H3)* (tblFacturas3[Pagada]=FALSO())*tblFacturas3[Importe])

celda H5:

=SUMAR.SI(tblFacturas3[Pagada],"VERDADERO",tblFacturas3[Importe])

celda H6: 

=SUMAPRODUCTO((tblFacturas3[Fecha Vencimiento]>=H3)*(tblFacturas3[Pagada]=FALSO())*tblFacturas3[Importe])


Si tenemos una tabla con muchas filas podemos y queremos agregar las casillas en un única operación podemos usar esta macro (igual a la anterior a la que le hemos agregado un loop):

Sub insert_check()
    Dim rngCell As Range
 
    Application.ScreenUpdating = False
 
    For Each rngCell In Selection
        rngCell.Select
        With ActiveSheet.OLEObjects.Add(classtype:="Forms.Checkbox.1", _
             Top:=ActiveCell.Top + 1, Left:=ActiveCell.Left + 15, _
             Height:=ActiveCell.Height, Width:=ActiveCell.Width * 0.5)
             .Object.Caption = ""
             .LinkedCell = ActiveCell.Address
             .Object.Value = False
         End With
     Next rngCell
    
     Application.ScreenUpdating = True
    
End Sub
Sub del_all_cb()