jueves, 25 de junio de 2020

Tablas dinámicas: un par de trucos que debes conocer

Hace algún tiempo que no escribo sobre tablas dinámicas, y hoy me ha resultado de interés recordar o explicar un par de trucos disponibles en nuestros informes de tabla dinámica
Comenzaremos con un origen o fuente de datos en nuestro libro, a partir del cuál creamos nuestra tabla dinámica... donde arrastraremos al área de filas un campo de 'Zona', al área de columnas el campo 'Producto' y el campo 'Unidades' al área de valores
Tablas dinámicas: un par de trucos que debes conocer

Una cuestión eternamente planteada es cómo poder aplicar filtros a toda la tabla dinámica por los elementos del campo del área de columnas (en mi ejemplo de 'Productos')... lo que no es configurable desde las opciones de tabla dinámica.
El truco es seleccionar una celda a la derecha de la tabla dinámica, cualquiera de la primera columna inmediata a la derecha, en las filas en que hay información en ésta... en la imagen celdas en amarillo.
Tras esta selección de celda solo hay que aplicar el Autofiltro
Tablas dinámicas: un par de trucos que debes conocer

Por arte de magia aparece el autofiltro aplicado a todos los elementos del campo 'Productos' del área de columnas!!.
Tablas dinámicas: un par de trucos que debes conocer

OJO!, por que el autofiltro se mantiene en esas celdas concretas donde se ha aplicado aún modificando la estructura de campos de la tabla dinámica.
Como apunte adicional, este truco es igualmente aplicable a rangos de datos :O

La segunda curiosidad de hoy requiere cargar nuestra fuente de información al Modelo de datos de Power Pivot, y generar la tabla dinámica desde nuestro Modelo...
Generaremos nuestra tabla dinámica (desde Power Pivot) con un diseño similar al anterior...
Tablas dinámicas: un par de trucos que debes conocer

Este tipo de Tabla dinámica nos ofrece una opción deshabilitada para las 'tablas dinámicas normales': Incluir elementos filtrados en los totales.
Esta opción concluye con mostrar en TODO momento, a pesar de los filtros aplicados, en los Totales generales el valor absoluto y NO el Total parcial de los elementoso visibles tras aplicar los filtros...
Veamos la diferencia... En un primer caso vemos el Total general con un filtro cualquiera aplicado
Tablas dinámicas: un par de trucos que debes conocer

Vemos como el Total general muestra un valor de 1.191 cuando el Total absoluto es de 2.047... todo correcto hasta aquí.
Ocurre que en ocasiones queremos ver, a pesar de los filtros aplicados, siempre en todo momento el Total absoluto, i.e., los 2.047; en este caso, y solo con tablas dinámicas generadas a partir del Modelo de datos de Power Pivot (repito!!), podemos ir a la pestaña de Diseño de las Herramientas de tabla dinámica, al grupo Diseño y al botón de Subtotales, donde seleccionaremos la opción Incluir elementos filtrados en los totales
Tablas dinámicas: un par de trucos que debes conocer

Tras activar la opción es fácil comprobar como el dato de Total general aparece con su valor absoluto... además el texto 'Total general' muestra un asterisco para resaltar esta situación
Tablas dinámicas: un par de trucos que debes conocer
Por supuesto, todos los cálculos adicionales, como Mostrar valores como..., campos calculados, etc.. funcionarán normalmente.

martes, 23 de junio de 2020

Ficha Dibujar: Una Pizarra blanca en Excel

En estos tiempos (muy sufridos debidos al COVID-19) de confinamiento, desescaladas y video-conferencias han visto nacer y reforzarse muchas plataformas colaborativos (sin duda Microsoft Teams ha ganado el espacio a muchas otras merecidamente)...
Muchas de ellas ponen a nuestra disposición Pizarras en blanco (Whiteboard) para que podamos expresarnos o ayudar a hace entender nuestras ideas... En mi caso, que las explicaciones se deben basar en Libros de trabajo de Excel, y estas 'herramientas en paralelo' no aportan nada especial...
Lo interesante en este aspecto es que desde la versión 2016 (creo recordar) tenemos de 'serie' disponible para nosotros la ficha DIBUJAR en Excel.
Solo hay que mostrarla. Para lo cual accederemos a las Opciones de Excel > Personalizar Cinta de Opciones > y marcaremos la pestaña Dibujar
Ficha Dibujar: Una Pizarra blanca en Excel

Tras la selección dispondremos en nuestra Cinta de opciones la nueva Ficha Dibujar con las distintas posibilidades ofertadas.. todas muy simples de emplear.
Ficha Dibujar: Una Pizarra blanca en Excel

A la izquierda, en el primer grupo 'Herramientas' se nos ofrecen las opciones de Dibujar, Borrador y Seleccionar a lazo.
Al marcar Dibujar dispondremos de los lápices, rotuladores de resaltado o plumas con sus distintos colores, grosores o efectos... pudiendo agregar al acceso rápido nuestros favoritos
Ficha Dibujar: Una Pizarra blanca en Excel

El Borrador, obviamente elimina nuestras entradas de lápiz según pasemos el cursor por encima....
Seleccionar a lazo habilita para 'rodear' las entradas realizadas.
Otras opciones en el siguiente grupo 'Convertir' ofrece la posibilidad de convertir 'nuestro dibujo' o entrada a lápiz en una autoforma... Permite de forma rápida y a mano alzada dibujar objetos de cualquier forma y condición...
También disponemos de la opción para insertar ecuaciones (tal como se explicó en su momento aquí).
Ficha Dibujar: Una Pizarra blanca en Excel

Finalmente, a la derecha de la Cinta de opciones de la ficha Dibujar encontramos una de esas virguerías que gustan tanto a muchos... un botón de Reproducción que permite reproducir, cual video, la secuencia temporal de nuestras entradas a lápiz!!
Me conformo con las herramientas estáticas básicas :DD
Un apunte más, e importante... Todas estas entradas a lápiz se gestionan a su vez desde la ficha Revisar > grupo Entradas de lápiz > botón desplegable Ocultar entradas de lápiz
Ficha Dibujar: Una Pizarra blanca en Excel

Este desplegable ofre tres opciones:
- Ocultar entradas a lápiz: que oculta/muestra la entradas existentes.
- Eliminar todas las entradas de la hoja: lo que elimina cualquier entrada de esta hoja.
- Eliminar todos los trazos en el libro: lo mismo en cualquier parte del libro.
Para terminar veamos un simple ejemplo de una reproducción de dos o tres entradas a lápiz...
Ficha Dibujar: Una Pizarra blanca en Excel

Sin duda una buena ayuda a nuestras presentaciones o videoconferencias ;-)

jueves, 18 de junio de 2020

Power Query: Exportar Consultas entre libros

En ocasiones, cuando disponemos de un nutrido repositorio de consultas de Power Query, se hace más óptimo aprovechar código M de nuestras consultas antes que generar una serie de pasos desde cero...
Aquí es donde entraría una opción de exportación/importación de consultas, que por desgracia a la fecha no existe :-(
¿Cómo conseguimos entonces traspasar códigos M existentes de un libro a otro?
El asunto es sencillo, bastará un simple Copiado y Pegado.
Entraremos al Editor de Power Query y desplegaremos el panel de consultas (a la izquierda de nuestra ventana). Nos aseguraremoso de seleccionar aquella query que nos interese o todas si fuera el caso...
Una vez seleccionadas quedan marcadas con un color distinto en su fondo.
OJO, al marcar más de una consulta, curiosamente copia todas!!
Solo seleccionando una por una cada consulta podremos discriminar qué consultas queremos trasladar...
En mi ejemplo he seleccionado todas las Consultas:
Power Query: Exportar Consultas entre Libros

Ahora viene lo fácil, hacemos clic derecho y elegimos la opción de Copiar
Power Query: Exportar Consultas entre Libros

Esta acción de copiado lleva al portapapeles todo el código M de las consultas seleccionadas...
De hecho, podrías verificar lo copiado llevándolo a un bloc de notas en blanco para ver dicho código de TODAS las queries!!
Pero nosotros queremos llevarla a nuestro nuevo entorno... a un nuevo libro de Excel. Así pues abrimos un nuevo libro y entramos al Editor de Power Query (para esto necesitamos cerrar el editor de 'origen').
Power Query: Exportar Consultas entre Libros

Al pegar se traspasarán las consultas copiadas...
Obviamente todas las relaciones, tablas, datos, etc a los que las antiguas consultas hacían referencia habrá que redirigirlas al nuevo contexto...
Power Query: Exportar Consultas entre Libros

Este problema, como se ve en la imagen, se comprueba facilmente al observar todas las consultas pegadas con el triangulito amarillo de advertencia de error.
Listos!...

martes, 16 de junio de 2020

Power Query: replicando SIFECHA

Hace algunas semanas tuve la necesidad de realizar en una Consulta de Power Query un cálculo de meses enteros transcurridos entre fechas... Busqué si existía en la biblioteca de funciones M algo similar, pero para mi decepción no la encontré :-(
Sin embargo con una búsqueda profunda por Internet hallé algún ejemplo que se asemejaba a lo que necesitaba en
www.goodly.co.in/calculate-age-years-months-power-bi/
y tras una modificación del código llegué a lo que necesitaba.
Power Query: replicando SIFECHA

Así pues los pasos para crear nuestra función SIFECHA en Power Query son:
1- Ir al Editor de Consultas y acceder a Ficha Inicio > Nueva Consulta > Nueov Origen > Otros Orígenes > Consulta en blanco
2- En el editor avanzado borramos las líneas existentes
3- Añadimos el siguiente código:
(F_Ini as date, F_Fin as date, tipo as text) => let 
factorDIA= if Date.Day(F_Fin) < Date.Day(F_Ini) then -1 else 0,
Temp = Date.EndOfMonth(#date(if (Date.Month(F_Fin) + factorDIA)=0 then Date.Year(F_Fin)-1 else Date.Year(F_Fin),
if (Date.Month(F_Fin) + factorDIA)=0 then 12 else Date.Month(F_Fin) + factorDIA, 1 )), UltDIA = List.Min({Date.Day(F_Ini), Date.Day(Temp)}), factorAÑO = if Date.DayOfYear(F_Ini) <= Date.DayOfYear(F_Fin) then 0 else 1, //Cáculos de periodos básicos
dias = Number.From(F_Fin) - Number.From(#date(if (Date.Month(F_Fin) + factorDIA)=0 then
Date.Year(F_Fin)-1 else Date.Year(F_Fin),
if (Date.Month(F_Fin) + factorDIA)=0 then 12 else Date.Month(F_Fin) + factorDIA, UltDIA)), meses = Date.Month(F_Fin) - Date.Month(F_Ini) + 12*factorAÑO + factorDIA, años = Date.Year(F_Fin) - Date.Year(F_Ini)-factorAÑO, SIFECHA = if F_Fin < F_Ini then null
else
//tipologías de cálculo a semejanza de SIFECHA
if tipo="y" then años //"y" : devuelve la cantidad entera de años en el intervalo de fechas.
else if tipo="m" then años*12 + meses //"m" : devuelve la cantidad entera de meses en el intervalo de fechas.
else if tipo="md" then dias //"md" : obtendríamos la cantidad de días por encima de la cantidad entera de meses.
else if tipo="ym" then meses //"ym" : obtendríamos la cantidad de meses por encima de la cantidad entera de años.
else if tipo="d" then F_Fin-F_Ini //"d" : devuelve la cantidad entera de días entre ambas fechas.
else null

in
SIFECHA

Power Query: replicando SIFECHA

Recuerda renombrar la Consulta-Función!!; yo la he llamada 'fxDATEDIF'.
Ya podemos hacer uso de nuestra función personalizada...
Tras haber cargado nuestra tabla con fechas, aplicamos y agregamos unas cuantas columnas personalizadas, donde haremos uso de los parámetros necesarios, iguales que en SIFECHA (ver aquí)
Serían:
"y" : devuelve la cantidad entera de años en el intervalo de fechas.
"m" : devuelve la cantidad entera de meses en el intervalo de fechas.
"d" : devuelve la cantidad entera de días entre ambas fechas.
"ym" : obtendríamos la cantidad de meses por encima de la cantidad entera de años.
"md" : obtendríamos la cantidad de días por encima de la cantidad entera de meses.
El código quedaría:
let
    Origen = Excel.CurrentWorkbook(){[Name="Tabla3"]}[Content],
    #"Tipo cambiado" = Table.TransformColumnTypes(Origen,{{"INI", type date}, {"FIN", type date}, {"SIFECHA", Int64.Type}}),
    //añadimos las columnas personalizadas
    #"Personalizada agregada" = Table.AddColumn(#"Tipo cambiado", "Y", each fxDATEDIF([INI],[FIN],"y")),
    #"Personalizada agregada1" = Table.AddColumn(#"Personalizada agregada", "M", each fxDATEDIF([INI],[FIN],"m")),
    #"Personalizada agregada2" = Table.AddColumn(#"Personalizada agregada1", "D", each fxDATEDIF([INI],[FIN],"d")),
    #"Personalizada agregada3" = Table.AddColumn(#"Personalizada agregada2", "YM", each fxDATEDIF([INI],[FIN],"ym")),
    #"Personalizada agregada4" = Table.AddColumn(#"Personalizada agregada3", "MD", each fxDATEDIF([INI],[FIN],"md")),
    
    #"Tipo cambiado1" = Table.TransformColumnTypes(#"Personalizada agregada4",{{"MD", type number}, {"D", type number}, {"YM", type number}})
in
    #"Tipo cambiado1"
Como hemos visto en la primera imagen del post, y puedes comprobar con el resultado de SIFECHA, los valores devueltos son correctos!. Obviamente un uso de las funciones M de fecha (leer algo más aquí) se hace necesario...
Funciones M empleadas para componer nuestra función personalizada:
Date.Day - recupera el día de una fecha dada (como DIA en Excel)
Date.Month - recupera el mes de una fecha dada (como MES en Excel)
Date.Year - recupera el año de una fecha dada (como AÑO en Excel)
también...
Date.EndOfMonth - retorna el último día del mes de una fecha dada (como FIN.MES en Excel)
Date.DayOfYear - revuelve un número que representa el día del año, i.e., un número entre 1 y 365/366
Number.From - convierte una fecha en un valor decimal, por ejemplo, la fecha 16/06/2020 la transforma en 43.998
y finalmente
List.Min - para obtener el mínimo valor entre varios elementos...
El resto de cálculos son los necesarios para llegar a las diferencias entre las fechas tomadas, teniendo presente los intervalos a emplear: años, meses o días...

jueves, 11 de junio de 2020

Power Query: Dependencias de consultas

Una herramienta interesante dentro del editor de consultas de Power Query es la de ver las Dependencias de la consulta, funcionalidad a la que accedemos desde la ficha Vista > grupo Dependencias > Dependencias de la consulta

Power Query: Dependencias de consultas



Esta herramienta nos ofrece un mapa completo de orígenes, relaciones y dependencias de todas las consultas existentes en nuestro libro de trabajo.
Además permite la traza de dependientes y precedentes de principio a fin marcando en el mapa cualquiera de las consultas (marcándolas en verde):

Power Query: Dependencias de consultas



Una posibilidad interesante es la que nos permite cambiar el aspecto de la vista del diseño del mapa con el desplegable de abajo 'Diseño' con varias opciones:
- De arriba a abajo
- De abajo a arriba
- De izquierda a derecha (mi favorito)
- De derecha a izquierda

Power Query: Dependencias de consultas



La pena es que de momento no se permite acceder a las 'tripas' de cada consulta desde este mapa...

martes, 9 de junio de 2020

Power Query y el Tipo Cambiado

Te habrá ocurrido mucas veces al Cargar datos a una Consulta de Power Query, es un poco frustante ver como el editor carga los datos y en un primer paso añadido provoca un cambio en los tipos de datos de todos los campos, forzando algunos bien y otros no, con toda su buena intención... jeje

Power Query y el Tipo Cambiado


Esto nos obliga o bien a eliminar el paso grabado en la consulta de Power Query, o bien revisar cada campo para ver qué tipo de dato le ha asociado...

Podemos evitarlo cambiando una de las opciones de la Consulta.
Desde el editor iremos al menú Archivo > Opciones y configuración > Opciones de la consulta > LIBRO ACTUAL > Carga de datos > Detección de tipos > Detectar automáticamente encabezados y tipos de columna para datos no estructurados

Power Query y el Tipo Cambiado



Lo normal es que la opción esté marcada, por lo que deberemos desmarcarla...

Desde el cambio en el libro, en futuras conexiones, no se incluirá ese 'molesto' paso de 'Tipo cambiado'

Power Query y el Tipo Cambiado



Una pena, pero hasta donde yo se, no es posible realizar este cambio a todas las consultas...

jueves, 4 de junio de 2020

Mostrar elementos del campo siguiente en la misma columna

Una opción curiosa cuanto menos dentro de las Tablas dinámicas es la que nos permite Mostrar elementos del campo siguiente en la misma columna... sin duda poco conocida.

Mostrar elementos del campo siguiente en la misma columna



La opción la encontramos en la Configuración de campo (dentro del área de filas o columnas) y en la pestaña Diseño e impresión, seleccionando Mostrar etiquetas de elementos en formato esquemático, y luego Mostrar elementos del campo siguiente en la misma columna.
Si bien esta acción solo tiene sentido con el Diseño en formato tabular (o también con la vista clásica)... donde pasamos de esto:

Mostrar elementos del campo siguiente en la misma columna


A, tras marcar la opción comentada, a este aspecto:

Mostrar elementos del campo siguiente en la misma columna



Conseguimos un aspecto 'combinado o híbrido' entre un diseño en formato tabular y compacto muy interesante para resaltar o enfocar aquellos campos relevantes.

Muy interesante, personalmente he de decir que no lo había utilizado nunca ;-)

martes, 2 de junio de 2020

VBA: Evitar flash del cursor

En ocasiones, al crear nuestros procedimientos recurrentes (ver ejemplo) se genera un efecto muy feo en nuestra hoja de cálculo, mostrando el cursor con el efecto de flash o actualización:

VBA: Evitar flash del cursor



Por ejemplo, el siguiente procedimiento:

Sub reloj()
Application.ScreenUpdating = False
Range("A40").Formula = "=NOW()"
Application.ScreenUpdating = True
Application.OnTime Now + TimeValue("00:00:01"), "reloj"
Application.ScreenUpdating = True
End Sub
''''''''''''''''''''''''''''''''''
Sub Auto_Open()
Call reloj
End Sub



Comprobamos como, a pesar de haber aplicado la típica interrupción del refresco de pantalla:
Application.ScreenUpdating = False

el indeseado efecto sigue apareciendo...

Una práctica solución pasa por forzar el cambio a un tipo de cursor en particular, por ejemplo, el clásico de la flecha.
Para ello emplearemos la propiedad
Application.Cursor
que establece el aspecto del puntero del ratón... Que nos ofrece las siguientes opciones:
xlDefault: Puntero predeterminado.
xlIBeam: Puntero en forma de I.
xlNorthwestArrow: Puntero de flecha orientada al noroeste.
xlWait: Puntero de reloj de arena.

Por ejemplo, para nuestro caso cambiaremos el puntero con:
Application.Cursor = xlNorthwestArrow


Tras aplicar un cambio de puntero, es recomendable invertir el cambio y volver al puntero predeterminado:
Application.Cursor = xlDefault


Por otra parte, aplicaremos la función DoEvents que permite la ejecución de nuestros procedimientos, de modo que el sistema operativo pueda procesar otros eventos.

Aplicando lo descrito anteriormente, nuestro procedimiento quedaría (ver filas 4 y 5):

Sub reloj()
Application.ScreenUpdating = False

Application.Cursor = xlNorthwestArrow
DoEvents

Range("A40").Formula = "=NOW()"
Application.ScreenUpdating = True
Application.OnTime Now + TimeValue("00:00:01"), "reloj"
Application.ScreenUpdating = True
End Sub
''''''''''''''''''''''''''''''''''
Sub Auto_Open()
Call reloj
End Sub



Al ejecutar la macro conseguimos que no se visualice el efecto de refresco... tal como pretendíamos.