Sugerencias y ayuda para Excel en español. Ejemplos de funciones y fórmulas, gráficos, automatización con Vba, Power Query y PowerPivot
martes, diciembre 22, 2009
Evitar borrar Validación de datos en Excel al pegar datos copiados
Volviendo sobre el tema, una de las debilidades de Validación de Datos es que si un usuario pega un valor en una celda del rango validado en lugar de ingresarlo manualmente, las definiciones de la validación quedan eliminadas.
La única forma de evitar estas situaciones es usar macros, más precisamente eventos.
Buscando en la Internet encontré, entre otras, una solución propuesta por John Walkenbach. El problema con esta solución es que si el usuario en lugar de pegar el valor usa la opción Pegado Especial-Valores (o Fórmulas), el evento no responde y el valor es aceptado.
El código que propongo usa una parte del código de Walkenbach, para el caso que el usuario use la opción de pegado común, y parte de mi código para el caso que use pegar-valores, pegar-fórmulas, Insertar o arrastre el valor a la celda.
En el módulo de Vba de la hoja pegamos estos códigos
Private Sub Worksheet_Change(ByVal Target As Range)
' rutina desarrollada por Jorge Dunkelman - JLD Excel Blog
' parte del codigo tomado de la nota de John Walkenbach http://www.j-walk.com/ss/excel/tips/tip98.htm
Dim rngValid As Range, cell As Range
Dim Msg As String
Dim codeValid As Variant
Set rngValid = Range("rngValidado")
On Error Resume Next
If Not HasValidation(rngValid) Then
Application.Undo
MsgBox "Valor no válido", vbCritical
Application.EnableEvents = False
Target.ClearContents
Application.EnableEvents = True
End If
For Each cell In Target
If Union(cell, rngValid).Address = rngValid.Address Then
codeValid = ActiveCell.Validation.Value
If codeValid = True Then
Exit Sub
Else
MsgBox "Valor no válido", vbCritical
Application.EnableEvents = False
cell.ClearContents
cell.Activate
Application.EnableEvents = True
End If
End If
Next cell
End Sub
Private Function HasValidation(r) As Boolean
Dim x
On Error Resume Next
x = r.Validation.Type
If Err.Number = 0 Then HasValidation = True Else HasValidation = False
End Function
Nótese que estamos usando un evento Worksheet_Change y una función UDF.
Al rango B3:B12 de la hoja hemos aplicado validación de datos con la opción Lista. Los valores permitidos son a1, a2, a3 y a4.
Este video muestra cómo funciona la macro
El archivo con el ejemplo y el código puede descargarse aquí.
jueves, diciembre 17, 2009
Construir un tablero de comandos (Dashboard) en Excel – cuarta nota
Esta función nos permite extraer datos de una tabla dinámica. La importancia de esta herramienta reside en el hecho que las tablas dinámicas son el método más eficiente de Excel para totalizar y analizar datos de una base de datos.
Vamos a mostrar un ejemplo basándonos en los datos del ejemplo de las notas anteriores.
El cuaderno con el ejemplo se puede descargar aquí.
Después de totalizar los datos en esta tabla dinámica

donde hemos agrupado los datos por zonas, años y trimestres.
El tablero de comandos que construiremos nos permitirá extraer datos dinámicamente para realizar comparaciones por años, trimestres y zonas

En este video pueden apreciar el funcionamiento del dashboard
El cuaderno contiene cuatro hojas

Reporte: contiene el tablero de comandos
td: donde reside la tabla dinámica que totaliza nuestros datos; esta hoja es el “motor” del modelo
BD: la base de datos
definiciones: esta hoja contiene los valores de dos rangos nominados (nombres) que usamos en las listas desplegables del dashboard.
Nuestro tablero de comandos se divide en dos zonas: la zona de los parámetros

donde establecemos los parámetros de los datos a comparar, y la zona de los resultados

Las columnas A y B están ocultas. Estas columnas nos sirven para manejar rangos auxiliares, cuyo objetivo mostraremos más adelante.
El rango F4:H6 es donde ponemos los parámetros del análisis, eligiéndolos de listas desplegables cuyas definiciones pueden verse en la hoja “definiciones”.
Antes de poner la fórmula en la celda F10 nos aseguramos que el generador de la función IMPORTARDATOS DINAMICOS esté activo.
En Excel 2007 seleccionamos una celda de la tabla dinámica y en la cinta de Opciones de las herramientas de tablas dinámicas abrimos la pestaña Tabla Dinámica-Opciones

En Excel Clásico (97-2003) encontramos esta opción en la barra de herramientas de las tablas dinámicas

Una vez que esta opción está activa creamos una referencia a la celda correspondiente en la tabla dinámica

Excel crea automáticamente la función con los argumentos relevantes
=IMPORTARDATOSDINAMICOS("Clientes ";td!$A$3;"Fecha";1;"Zona";"Este";"Años";2007)
Analicemos esta fórmula:
el “1” que aparece después de “Fecha” es la referencia al Trimestre 1 (el primer elemento del campo Fecha). Este elemento debe ser dinámico, es decir, cambiar de acuerdo a la elección del usuario.
“Este” define que zona hemos elegido. También este elemento debe cambiar dinámicamente.
“2007” es el otro elemento que deberá cambiar de acuerdo a la elección del usuario.
Estos elementos serán reemplazados de esta manera:
=IMPORTARDATOSDINAMICOS("Ventas ";td!$A$3;"Fecha";$A$5;"Zona";F6;"Años";F4)
$A$5 reemplaza el índice del elemento del campo fecha.
La celda A5 contiene la fórmula
=COINCIDIR(F5;Trimestre;0)
cuyo valor sirve como argumento en las funciones IMPORTARDATOS DINAMICOS con las que extraemos los datos

Lo mismo con B5 que contiene la fórmula =COINCIDIR(H5;Trimestre;0)

Los argumentos “Año” y “Zona” podemos pasarlos directamente de las celdas F4 y F6 donde el usuario hace su elección.
Hacemos lo mismo con el resto de las celdas en las filas 10 y 11. Con esto nuestro modelo es absolutamente dinámico.
Las celdas F12, H12 y J12 contienen simples fórmulas para calculas el cambio porcentualmente.
Finalmente agregamos los gráficos con técnicas como las que he mostrado en la nota anterior.
El cuaderno se puede descargar aquí.
Technorati Tags: MS Excel
lunes, diciembre 14, 2009
Construir un tablero de comandos (Dashboard) en Excel – tercera nota
Al hablar de espacio limitado nos referimos a la necesidad de colocar toda la información en una “unidad de presentación” que puede ser el espacio visible de una pantalla o una hoja impresa, por lo general del tamaño A4.
Por lo general trataremos de acomodar todos los elementos del reporte en una vista de pantalla cuando se trate de dashboards dinámicos que son aquellos donde el usuario puede cambiar datos y obtener distintas vistas del informe (como en el ejemplo de las dos primeras notas).
Por otro lado hay no pocos gerentes que prefieren recibir informes impresos, lo que nos lleva a diseñarlos de manera que toda la información esté contenida en una hoja, o en unidades lógicas de una hoja.
Sea cual fuere nuestra situación necesitamos crear dos tipos de elementos: mini-gráficos y tablas de datos cuyas dimensiones sean independientes de las dimensiones de las celdas de la hoja.
Veamos un ejemplo de mini-gráfico. Supongamos esta tabla de ventas y ganancias por meses
Creamos un cuadro de texto que coincida con el alto del gráfico donde ponemos el rótulo Ventas orientado verticalmente Por ejemplo, supongamos que queremos agregar una tabla que muestra para cada mes cuál es la sucursal que más vendió. Esta tabla tiene sólo dos columnas, mes y sucursal, pero queremos que su ancho coincida con el de la tabla de ventas. Empezamos por crear la tabla en otra hoja La misma funcionalidad de la cámara podemos lograrla usando Pegar-Pegar como imagen-Pegar vínculos de imagen. Technorati Tags: MS Excel
Queremos crear dos mini-gráficos que pondremos al lado de la tabla: ventas y ganancias. Empezamos por seleccionar el rango A1:B11 y crear el gráfico de las ventas
Queremos reducir el tamaño del gráfico para encuadrarlo con la tabla de datos. Quitamos algunos elementos innecesarios como la leyenda, reducimos el gráfico al tamaño deseado y lo movemos a su ubicación al lado de la tabla. Hacemos lo mismo con las ganancias. Al final del proceso obtenemos este resultado (para obetener dos gráficos idénticos en tamaño, creamos el primero y luego lo copiamos cambiando las referencias de las series de datos)
El resultado es horrendo pero ahora veremos cómo mejorarlo. Borramos el título del gráfico, lo cual no permite recuperar “terreno” valioso.
EL próximo paso es reducir el tamaño de la fuente. Seleccionamos uno de los ejes y cambiamos el tamaño de la fuente a 7 por ejemplo. Luego elegimos otro eje y apretamos F4. Repetimos la operación con los ejes restantes.
Para ganar más espacio cambiamos el formato de los números del eje de las Y a miles usando este formato personalizado
###.###. "M";[Rojo](###.###.)"M";0 “M”
También podemos convertir los valores del eje de las X a los nombres de los meses, o mejor aún, sus iniciales (“ene” para enero, “feb” para febrero, etc.). Esto lo hacemos con el formato personalizado “mmm”
El resultado hasta ahora es el siguiente
Ahora necesitamos poner un título a cada gráfico, para lo cual vamos a aprovechar el espacio disponible entre el borde derecho de los gráficos y el de la columna G.
El resultado final es
El otro tema a tratar es cómo acomodar tablas cuyas dimensiones son distintas de las de la hoja a de otra tabla con la cual queremos que coincida.
Hay varias soluciones, algunas no recomendadas como usar “combinar y centrar”, por ejemplo. En esta nota mostraremos como usar la cámara fotográfica de Excel para este cometido.
Seleccionamos el rango de la tabla, A1:B11, y pulsamos el icono de la cámara (en la imagen arriba pueden ver que he agregado el icono a la barra de herramientas de acceso rápido)
Volvemos a la hoja de dashboard y hacemos clic en el lugar donde queremos poner la tabla. Como es una imagen, podemos moverla y cambiar su tamaño independientemente de las dimensiones de la hoja.
En la imagen arriba podemos ver que se trata de una imagen ligada al rango de la tabla de la hoja 2 (en la barra de las fórmulas vemos la referencia al rango de la tabla). Esto significa que todo cambio en la tabla original se reflejará inmediatamente en la imagen.