Mostrando las entradas con la etiqueta Tablas Dinamicas. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Tablas Dinamicas. Mostrar todas las entradas

domingo, abril 12, 2020

Excel, Power Query y Covid-19

Aclaración importante: el objetivo de este post es mostrar las capacidades de Power Query y PowerPivot y de ninguna manera analizar o sacar conclusiones sobre la evolución de la pandemia.

Dicho esto veamos podemos analizar las estadísticas sobre el Coronavirus usando Power Query y PowerPivot.

Mi objetivo es combinar los datos que por lo general aparecen en páginas Web que se ocupan del tema, con otros datos como población (tamaño y densidad) y edad promedio. También generar indicadores como porcentaje de defunciones del total por millón habitantes, porcentaje de sanados del total de confirmados, porcentaje de defunciones del total de confirmados y otras más.

En este post no voy a mostrar en detalle el desarrollo del modelo, que se puede descargar aquí, sino solamente los lineamentos generales. Quien no esté interesado en los lineamentos del modelo puede ir directamente a la parte final del post para ver algunos de los reportes que se pueden crear.

Aclaración sobre la descarga del archivo: el archivo está ligado dinámicamente a las fuentes de datos; cada vez que se abre el archivo los datos se actualizan por lo que la apertura del archivo puede durar un poco más de los esperado. El cuaderno fue desarrollado usando Excel 365; en otras versiones puede no funcionar o no actualizar los datos.

1 - Las fuentes de los datos.
  • Wikipedia: en esta página de Wikipedia se encuentra la tabla por localidad con los casos confirmados, los recuperados y las defunciones.
  • Worldmeter: en esta página encontramos una tabla con datos de población, superficie, edad promedio y más por país.

martes, abril 07, 2020

Whatsapp y Power Query en tiempos del corona

En la última edición de las tablas de Moisés, corregida y aumentada debido al virus Corona, se ha agregado un nuevo mandamiento: "No reenviarás mensajes, chistes, videos y similares en vano".
Quien más, quien menos, todos pecamos; por aburrimiento, supongo.

En uno de mis grupos Whatsapp alguien se quejó de la cantidad de mensajes y videos reenviados, muchos de los cuales son "fakes", como por ejemplo el poema atribuido a Mario Benedetti (que fue escrito por Alexis Valdez) o que se puede prevenir la infección haciendo gárgaras con bicarbonato de sodio. Buena parte de la discusión giró en torno a quien mandaba más mensajes al grupo. Las respuestas fueron, como era de esperar, "yo no".

Para dirimir la cuestión había que contar cuantos mensajes mandó cada uno al grupo. Una posibilidad era hacer el recuento manualmente lo que demandaría a alguien con la paciencia de un monje tibetano. Otra posibilidad era echar mano a Excel, más precisamente al Power Query. En este post voy a mostrar como hacerlo.

Empezamos por exportar el "chat" del grupo:

miércoles, octubre 04, 2017

Crear tablas dinámicas con datos externos

No sé cuántos de mis lectores usan o conocen la opción "Utilice una fuente de datos externa" para crear tablas dinámicas


Cuando no existe la necesidad de hacer transformaciones a los datos originales, esta opción es muy conveniente (cuando necesitamos transformar datos Power Query es la herramienta más apropiada).
La idea del post surgió a partir de la consulta de un colega en el trabajo. Su problema: tenía que construir un reporte con una tabla dinámica, pero la tabla con los datos de origen tenía varios cientos de miles de filas, número que iba incrementándose cada mes. A corto plazo la base de datos superaría el millón de filas, más allá de la capacidad de una hoja de Excel.
Inmediatamente comprendí que mi colega importaba los registros (filas) de la base de datos a una hoja de Excel, lo cual es innecesario.
Las ventajas de crear una conexión sin importar físicamente los datos a una hoja de Excel son evidentes:

  • evitamos duplicar los datos (también en a base de datos y también en la hoja);
  • nuestro archivo será mucha más liviano;
  • cuando hay cambios en la base de datos (nuevos registros, por ejemplo) basta con apretar el botón Actualizar para refrescar los datos;
  • podemos desconectar las tablas dinámicas creadas del origen y así proteger datos discretos. Sobre este tema pondré un ejemplo al final del post.
Para crear una tabla dinámica con esta técnica empezamos con una hoja vacía. Abrimos el menú Insertar-Tabla dinámica-Utilice una fuente..." y apretamos el botón "Elegir conexión".


Si la conexión que buscamos no aparece en la lista de conexiones disponibles, usamos el botón "Examinar en busca de más" (en la parte inferior izquierda del formulario). En este ejemplo voy a crear una conexión a la base de datos Northwind que puede estar en mi máquina, en la red a la cual estoy conectado o en la Web. Al apretar el botón aceptar veremos l plantilla de la tabla dinámica vacía y la lista de campos que podemos utilizar para crear el reporte dinámico


A partir de aquí podemos crear nuestros reportes sin que los datos de base estén físicamente en la hoja. Por ejemplo, este reporte de ventas donde usamos el campe de Filtro para filtrar los informes por vendedor


Una de las ventajas, como señalamos, es que nuestro archivo será más liviano. El archivo de este ejemplo peso 132 KB. Si hubiéramos importado los datos a una hoja del cuaderno pesaría 427 KB, tres veces más.

La otra ventaja de este método surge cuando trabajamos con datos que requieren discreción. Siguiendo con nuestro ejemplo supongamos que generamos un reporte para cada agente de ventas (que hacemos con facilidad con la técnica que muestro en este post) pero no queremos que puedan ver los resultados de los otros colegas.

Una posibilidad es copiar y pegar los datos en otra hoja con la opción "sólo valores". Pero esta técnica tiene dos inconvenientes:
  • es trabajosa si se trata de muchas hojas (agentes en nuestro ejemplo);
  • al pegar los datos los formatos de la tabla desaparecen (podemos usar el tip que muestro en este post, pero también es trabajoso).
Si creamos los reportes dinámicos en base a una tabla dinámica "conectada", todo lo que tenemos que hacer es cancelar al conexión


Excel transforma la tabla dinámica en una matriz de valores, sin fórmulas, sin conexiones y manteniendo los formatos. Veamos el proceso en este video


lunes, agosto 14, 2017

Autofiltro en tablas dinámicas - otro truco

Si bien este post trata sobre Autofiltro en Tablas Dinámicas, la idea surgió de uno de los videos del curso sobre Power Query, Power Pivot y Power BI de Miguel Escobar que recomiendo considerar a todo analista que usa Excel y quiera potenciar su profesionalidad (aclaración: si, recibo una comisión por cada inscripción pero ésto no quita de la calidad del curso).

Volviendo a nuestro tema, en mi post Filtrar por etiquetas en tablas dinámicas con dos criterios mostré como podemos agregar Autofiltro a una tabla dinámica para lograr filtrados que no serían posibles con el filtrado incorporado de la tabla dinámica.

Viendo uno de los videos del curso vi otro beneficio que puede obtenerse con esta técnica. Miguel ha incorporado como bono tres videos de Bill Jelen (Mr. Excel) que se titulan "Tres razones por las qué amo Power Pivot". En uno de ellos Bill muestra otro beneficio que podemos obtener agregando Autofiltro a una tabla dinámica.

Veamos la siguiente situación


Agreguemos ahora una columna que muestre el porcentaje del total de cada cliente como muestro en este video



Ahora podemos ver todos las ventas a los clientes de la vendedora Anna, ordenados de mayor a menor y el peso relativo de cada uno del total.


Si queremos mostrar los cinco clientes más importantes podemos usar el filtro de la tabla dinámica


y en la ventanilla de "Diez mejores" ponemos 5; éste es el resultado


Excel efectivamente nos muestra los cinco clientes con más ventas pero ahora el total general es el de los cinco clientes, no el total general del cuadro anterior y lo mismo sucede con los porcentajes. El cliente Rattlesnake Canyon Grocery que representa el 14.72% de las ventas ahora muestra el 24.44%.

La técnica que mostré en el post que menciono al principio de de esta nota puede ayudarnos a superar este inconveniente.

Si seleccionamos alguna celda de la tabla veremos que la opción Autofiltro está deshabilitada (no así, curiosamente, la opción "borrar" del filtro)


Siguiendo la técnica mencionada, seleccionamos la celda inmediatamente a la derecha de la última etiqueta de las columnas de la tabla. Al hacerlo veremos que ahora podemos aplicar la opción "Filtro" . Al hacerlo el Filtro se aplicará también a los campos de datos de la tabla


Ahora vamos a usar la opción "Diez mejores" del filtro del campo "Ventas" (que antes no existía) para mostrar los cinco principales clientes


La única diferencia con el método anterior es que para mostrar los primero cinco vamos a introducir seis en la definición del filtro (es decir, el número de filas a mostrar más uno)


Podemos ver que con esta técnica el total general y los porcentajes se mantienen.

El motivo por el que elegimos 6 para mostrar 5 es que con esta técnica la fila del total general es una de las incluidas en el recuento, de manera que para mostrar cinco clientes tenemos que definir seis filas.

lunes, agosto 07, 2017

Reportes dinámicos con Power Query

La introducción de las nuevas herramientas de Excel, Power Query y PowerPivot, han facilitado enormemente la tarea de analizar datos y crear reportes. La evolución que comenzó hace veinte años con las tablas dinámicas, ha terminado por convertir a Excel en una verdadera herramienta de BI (Business Intelligence).
Hoy en día Excel puede "digerir" cualquier cantidad de datos de prácticamente cualquier origen. Los analistas de datos sabemos que la principal dificultad es crear un reporte dinámico que sea "a prueba de balas" aun en manos del más insoportable de los gerentes de nuestra compañía.

Veamos el siguiente escenario: a partir de los datos de ventas (en nuestro ejemplo usaremos la consulta Invoices de la base de datos Northwind) creamos una reporte que muestra las ventas de los 10 principales clientes de la empresa. Después de volcar los datos en una hoja de Excel (o crear una conexión a la base de datos), creamos una tabla dinámica

y la filtramos con la posibilidad Filtros de Valor-Diez mejores


Diez minutos después de haber enviado el reporte nuestro jefe nos preguntará qué tiene que hacer para ver 25 clientes en lugar de 15.
Aquí comienza nuestro dilema. Una posibilidad es explicarle al jefe como cambiar los valores del filtro. La pregunta contiene la respuesta: si supiera como hacerlo no lo hubiera preguntado y si no lo sabe la probabilidad que entienda la explicación y no arruine el reporte es mínima.
La solución es crear un mecanismo tal que al introducir un número en una celda de la hoja, la cantidad de clientes en el reporte cambie, como en este ejemplo


Una posibilidad es usar una macro que tome el valor de la celda C3 y lo use como variable para cambiar el valor del filtro. En este ejemplo, en lugar de macros, estoy usando el valor de la celda C3 para cambiar la consulta hecha con el Power Query a la base de datos.
Veamos como construir el modelo paso por paso.
Empezamos por crear una consulta a la base de datos (en nuestro ejemplola base Northwind en Access). Las transformaciones que hacemos con Power Query pueden verse en este video



Después de crear la conexión, agrupamos las filas por cliente creando un campo que totaliza la ventas por cliente; ordenamos las filas en orden decreciente por total de ventas; agregamos una columna Índice que nos servirá de indicador; eliminamos las columnas agrupadas y expandimos "Todas Filas" de manera que volvemos a tener todas las columnas originales más el índice; finalmente filtramos la consulta con el criterio "<=15".

El segundo paso es crear una conexión a la celda C3 para poder controlar la cantidad de filas filtradas. La clave aquí es crear un nombre definido que se refiera a la celda. La forma más práctica es seleccionar la celda y reemplazazr la referencia en el cuadro de nombres por un nombre, en nuestro ejemplo "TopCust"

Ahora usamos la opción "Obtener datos - desde una tabla o rango" y en la consulta creada usamos "Rastrear desagrupando datos" (Drill Down)

con este resultado


La consulta, que recibe el nombre del nombre definido (TopCust), la guardamos creando sólo una conexión.

Ahora volvemos a editar la primer consulta y en el último paso, Filas Filtradas, reemplazamos el valor fijo por la segunda consulta "TopCust"


Ahora, al cambiar el valor de la celda C3 (TopCust) al apretar "Actualizar todo" el modelo se actualizará


Un detalle crítico es deshabilitar las actualización en segundo plano, como muestro en este post.

Si queremos que nuestro modelo sea totalmente dinámico podemos agregar una evento (macro) de manera que al cambiar el valor en la celda C3, se ejecute el método RefreshAll. En el módulo de la hoja ponemos este evento

 Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = Range("TopCust").Address Then ThisWorkbook.RefreshAll  
 End Sub  


miércoles, marzo 30, 2016

Ocultar y mostrar filtros en tablas dinámicas seleccionadas

En el post anterior prometí subir una macro que no sólo nos permita ocultar los filtros de una tabla dinámica sino también que nos permita sobre que tablas actuar cuando hay más una en la hoja activa.

Supongamos este caso donde tenemos tres tablas (o mejor dicho, reportes) dinámicas en la hoja


tablas con filtros

Nuestro objetivo es seleccionar qué tablas aparecerán con filtros de campos y cuáles no. Para eso debemos tener la posibilidad de seleccionar sobre qué tablas aplicar la macro.

Este video muestra el funcionamiento de la macro





El cuaderno con los códigos y el userform puede descargarse aquí.

La macro funciona con un Userform y los códigos de sus elementos 


y una sub para disparar el userform


Para utilizar la macro podemos guardarla en el cuadero Personal y crear un atajo en la barra de acceso rápido o usar Alt+F8 - Ejecutar


lunes, marzo 28, 2016

Ocultar filtros en todas las tablas dinámicas de una hoja

Gustavo, colega en el trabajo, es uno de esos tipos que pueden causarte un otoño capilar prematuro con sus observaciones. En particular porque siempre le encuentra la quinta pata al gato, siempre habrá algún pero.
Así que cuando vio mi macro para mostrar u ocultar filtros de tablas dinámicas, no pudo menos que decirme: "muy bien, ¿pero si hay más de una tabla dinámica en la hoja?
Es bastante común que haya más de una tabla dinámica en una hoja por lo que tendremos que dar una solución al planteo de Gustavo.

Modificar la macro propuesta en la nota anterior para que muestre u oculte todos los filtros de todas las tablas dinámicas en la hoja activa es sencillo. Supongamos esta hoja con dos tablas dinámicas




Para ocultar los filtros de las dos tablas a la vez usamos este código



 Sub ocultar_Filtros_all()  
   Dim ptbl As PivotTable  
   Dim pfld As PivotField  
   For Each ptbl In ActiveSheet.PivotTables  
    For Each pfld In ptbl.PivotFields  
      pfld.EnableItemSelection = False  
    Next pfld  
   Next ptbl  
 End Sub  

Para restaurar los filtros usamos este otro código



 Sub mostrar_Filtros_all()  
 Dim ptbl As PivotTable  
 Dim pfld As PivotField  
   For Each ptbl In ActiveSheet.PivotTables  
    For Each pfld In ptbl.PivotFields  
      pfld.EnableItemSelection = True  
    Next pfld  
   Next ptbl  
 End Sub  

Para que nuestra macro sea realmente útil tenemos que agregar la posibilidad de seleccionar que tablas queremos modificar, lo cual será el tema del próximo post.




martes, febrero 02, 2016

Calcular registros únicos con PowerPivot

En la nota anterior vimos como calcular los registros únicos de un campo usando la técnica "pivotear una pivot", es decir, crear una tabla dinámica cuya base de datos es a su vez una tabla dinámica. Esta técnica nos permite sobrellevar los problemas de tiempo de proceso que surgen al usar las técnicas más tradicionales: campo auxiliar con CONTAR.SI y Filtro Avanzado. Recordemos que si estamos usando Excel 2013 podemos agregar la base de datos al modelo de datos y usar luego la función Recuento Distinto para resumir el campo (ver en la parte final de la nota mencionada).

Existe una forma aún más sencilla de hacer el cálculo de registros únicos (o Recuento Distinto) si usamos Excel 2010. Primero deberemos asegurarnos de instalar el complemento PowerPivot (¿cómo??!!!! ¿Todavía no lo han hecho?!!!).

Volviendo al ejemplo de la nota anterior, empezamos por cargar la base de datos en la ventana del PowerPivot para lo cual seleccionamos alguna de las celdas de la tabla de datos y usamos "Crear tabla vinculada"


Una vez cargada creamos una tabla dinámica con la opción "Tabla Dinámica" en la ventana del PowerPivot


con el campo País en el área de las filas e Importe en el área de los valores


Para poder calcular la cantidad de clientes por país, vamos a crear una "Medida". En PowerPivor una "medida" (measure, en inglés) es similar a los campos calculados de las tablas dinámicas tradicionales pero mucho más flexibles y potentes . No entraré aquí en el tema, pero a los interesados en el potencial de PowerPivot les sugiero visitar el sitio de Powered Solutions (en español)

Volviendo al tema, creamos una medida apuntando al nombre de la tabla en la lista de campos y eligiendo la opción "Agregar nueva medida"

En la ventana que se abre para definir la medida vamos a usar la función DISTINCTCOUNT (esta es una función DAX que pertenece a PowerPivot, tema que no tocaremos en esta nota).

Este video muestra el proceso



El resultado final es este

jueves, enero 28, 2016

Calcular registros únicos en rangos extensos - otra versión

Supongamos que tenemos una tabla de datos de ventas donde cada registro (fila) nos muestra el país, la ciudad, el cliente, el producto, la cantidad y, por suspuesto, el importe.
Ahora supongamos que nuestro jefe (o jefa) nos pide saber cuantos clientes hay en cada país. Esto significa hacer un recuento de valores únicos.

Cuando se trata de rangos extensos nada mejor que usar tablas dinámicas. Hemos mostrado en el pasado cómo hacerlo, como pueden ver en esta nota.

Excel 2013 cuenta con la función incorparada para registros únicos tal como mostré en esta nota.

Si todavía usamos Excel 2010 y la tabla de datos es extensa, por ejemplo 500 K filas, las técnicas que usan CONTAR.SI son prácticamente inútiles por el tiempo de proceso que demandan. Tampoco Filtro Avanzado con la opción Registro Únicos ofrece una solución eficiente.

El MVP Roger Govier propuso una solución que consiste en construir una tabla dinámica cuya base de datos es otra tabla dinámica; es decir, pivotear una pivot table.

Veamos como es esta técnica. Esta es nuestra tabla de datos


Como nos piden el "recuento distinto", cuántos clientes hay en cada país, construimos esta tabla dinámica



Para que la etiqueta del país se repita en todas las filas usamos Configuración de campo - Diseño e Impresión - Repetir etiquetas de elementos


Otros detalles importantes:
  • dar a la tabla formato tabular (por defecto la tabla tiene el formato Compacto);
  • quitar los Subtotales del campo País;
  • quitar los Totales de las filas y las columnas.
Ahora vamos a construir una segunda tabla dinámica basada en la primera

No es indispensable ubicar la segunda tabla dinámica en la misma hoja como la primera, pero lo hacemos por comodidad.
En esta tabla dinámica ponemos el campo País en el área de las filas y el campo Cliente en el área de los datos. Como Clliente no es un campo numérico, Excel usa la función Cuenta lo que nos da el número de clientes únicos por país


Para completar nuestro modelo debemos agregarle dinamismo, es decir, la capacidad de ampliarse dinámicamente (en ingles: "scalabilty", la capacidad de ir acomodándose a incrementos de datos; la palabra "escalabilidad" no existe en castellano, por lo menos por ahora).
Para hacerlo tenemos que crear un rango dinámico que se refiera a la primer tabla dinámica. Si intentamos definir la tabla dinámica como Tabla (Insertar-Tabla) veremos que esto no es posible. Así que echaremos manos a las técnicas "tradicionales", creando un nombre que se refiera al rango en forma dinámica usando la INDICE y CONTARA. En nuestro ejemplo definimos el nombre "rngTablaDatos" que se refiere a esta fórmula:

=Hoja1!$A$3:INDICE(Hoja1!$C:$C,CONTARA(Hoja1!$A:$A)+2)


Otra mejora posible es crear un evento que actualize la tabla cada vez que se genera un cambio en la base de datos, como muestro en esta nota.

martes, septiembre 22, 2015

Ocultar filtros en tablas dinámicas

Cuando creamos una tabla dinámica Excel instala filtros en los distintos campos (filas, columnas y filtro del informe)


Si por algún motivo queremos ocultar las flechas de los filtros, por ejemplo para evitar que un usuario cambie el contenido del informe, podemos usar la opción "Encabezados de campos" en el grupo Mostrar en las Opciones de las tablas dinámicas

Pero esta opción tiene un problema: no sólo quita las flechas sino también los encabezados

y como bono adicional, no quita el encabezado ni la flecha del filtro del informe. Los encabezados Ciudad, Agente y Año han desaparecido del informe dejando a nuestro desprevenido y poco informado usuario cavilando sobre si Janet Leverling es un agente de ventas o tal vez un cliente.

Para quitar las flechas de los filtros sin quitar los encabezados podemos usar esta macro

Sub ocultar_Filtros()
Dim ptbl As PivotTable
Dim pfld As PivotField
    Set ptbl = ActiveSheet.PivotTables(1)
      For Each pfld In ptbl.PivotFields
          pfld.EnableItemSelection = False
      Next pfld
End Sub


Esta animación muestra el resultado


Para volver a mostrar los filtros usamos esta macro, igual a la anterior pero con la propiedad EnableItemSelection con el valor True

Sub mostrar_Filtros()
Dim ptbl As PivotTable
Dim pfld As PivotField
    Set ptbl = ActiveSheet.PivotTables(1)
      For Each pfld In ptbl.PivotFields
          pfld.EnableItemSelection = True
      Next pfld
End Sub


De la misma manera podemos ocultar el filtro de un determinado campo. Para evitar que el usuario pueda filtrar el informe por Agente usamos esta macro

Sub ocultar_Item()
Dim ptbl As PivotTable
Dim pfld As PivotField

    Set ptbl = ActiveSheet.PivotTables(1)
    ptbl.PivotFields("Agente").EnableItemSelection = False
  
End Sub


Para volver a mostrar el filtro del campo cambiamos el valor de la propiedad EnableItemSelection a True.


lunes, agosto 24, 2015

Formato numérico de campos de datos en tablas dinámicas

Podemos considerar dos formas de organizar datos en una hoja de Excel: en forma plana ("flat file") y en forma tabular ("tabular dataset").  Supongamos una de tabla de ventas que muestra las cantidades vendidas de distintos productos por año. Si organizamos la tabla en forma plana tendremos algo así

En cambio si organizamos los datos en forma tabular, tendremos esta tabla


Esta última forma donde todos los valores (datos numéricos) están en una única columna (un solo único campo numérico) es la más eficiente para trabajar con tablas dinámicas.

Pero si tenemos que crear una tabla dinámica a partir de una matriz de datos plana descubriremos que cada campo de valor (las columnas 2010, 2011, etc, en el primer ejemplo) debe ser arrastrado individualmente al área de los datos. Y lo mismo cuenta para el formato de los números. Excel da por defecto formato "General" a los datos numéricos.

Al crear esta tabla dinámica


si queremos cambiar el formato de los valores tendremos que hacerlo campo por campo, cinco veces en nuestro caso. En nuestro auxilio vendrán las macros, como cada vez que tenemos que queremos automatizar una tarea repetitiva.

Si tenemos una única tabla dinámica en la hoja activa podemos usar esta macro

Sub format_NUM_1()
    Dim strFormatSelected As String
    Dim oPTable As PivotTable
    Dim oPField As PivotField
    Dim iPTCount As Integer
 
    iPTCount = ActiveSheet.PivotTables.Count
    If iPTCount = 0 Then
        MsgBox "No se encontraron tablas dinamicas en la hoja", _
                    vbInformation, _
                    "Formato numerico"
        Exit Sub
    End If

    Set oPTable = ActiveSheet.PivotTables(1)

    Application.Dialogs(xlDialogFormatNumber).Show

    strFormatSelected = ActiveCell.NumberFormat

    For Each oPField In oPTable.DataFields
        oPField.NumberFormat = strFormatSelected
    Next oPField
 
End Sub


Usamos el método Application.Dialogs(xlDialogFormatNumber).Show para abrir el diálogo de formato de números, capturamos la elección de usuario y con el loop For Each...Next lo aplicamos a todos los campos de datos de la tabla.

Este video muestra el funcionamiento



Si hay más de una tabla dinámica en la hoja activa tendremos que complicar un poco nuestro código

Sub format_NUM_all()
    Dim strFormatSelected As String
    Dim oPTable As PivotTable
    Dim oPField As PivotField
    Dim iPTCount As Integer
    Dim iX As Integer

    iPTCount = ActiveSheet.PivotTables.Count
    If iPTCount = 0 Then
        MsgBox "No se encontraron tablas dinamicas en la hoja", _
                    vbInformation, "Formato numerico"
        Exit Sub
    End If
    
    With Application
        .ScreenUpdating = False
        .Dialogs(xlDialogFormatNumber).Show
        strFormatSelected = ActiveCell.NumberFormat

        For iX = 1 To iPTCount
            For Each oPField In ActiveSheet.PivotTables(iX).DataFields
                oPField.NumberFormat = strFormatSelected
            Next oPField
        Next iX
        .ScreenUpdating = True
    End With



Podemos llevar nuestra macro un paso más adelante y dar al usuario la posibilidad de elegir que tabla dinámica formar de las que se encuentran en la hoja activa.

En este caso tendremos que agregar un Userform con una combobox, que contendrá los nombres de las tablas dinámicas presentes en la hoja activa (un evento crea la lista dinámicamente de acuerdo a la hoja), y una rutina que recibe como variable el nombre de la tabla elegida, abre el diálogo de formato numérico y aplica el formato elegido a la tabla.

Podemos reunir todas las macros en un complemento (Add in) e instalarlo de manera que podamos usarlo en todo cuaderno activo de Excel.
Otra ventaja del complemento es que agregará una pestaña en la cinta de comandos para activar las macros con facilidad.


El complemento se puede descargar sin cargo aquí

Después de descargar y guardar el complemento lo instalamos usando el menú Programador-Complementos (en caso de ser necesario usamos el botón Examinar para encontrar la ubicación del complemento)


En caso de recibir una advertencia de seguridad aceptamos la opción "Habilitar contenido".

Este video muestra la instalación y el funcionamiento de la macro



Los códigos pueden verse con el editor de Vba (el complemento no está protegido con contraseña).

Algunas observaciones:
  • como norma de buena práctica es recomendable reemplazar el nombre por defecto de la tablas dinámica (Tabla dinámica1, Tabla dinámica2, etc.) por algo más significativo

lunes, agosto 17, 2015

Copiar y pegar formatos de tabla dinámica

En ciertas ocasiones queremos evitar que el usuario pueda ver todos los datos que alimentan una tabla dinámica. Dado que Excel no tiene un método para "desconectar" la tabla de la base de datos, la forma de hacerlo es con Copiar-Pegar Valores.

Pero este método tiene un inconveniente: Excel sólo copia los datos sin copiar los formatos que hayamos establecido en el reporte.

Por ejemplo, si copiamos con Pegar-Valores-Formato y Origen este informe dinámico al que hemos aplicado uno de los estilos


ek resultado no será el esperado; sólo el formato de los números aparece y ancho de las columnas son copiados; el resto de los formato desaparece.


Sin embargo podemos hacerlo usando este truco (tomado de este post de John Walkenbach)

Empezamos por seleccionar el rango de la tabla (o el rango de las columnas que ocupa), aplicamos Copiar y seleccionamos la primer celda del rango al cual queremos copiar la tabla.

Luego en la cinta Vamos a Inicio y abrimos el Portapapeles usando la flecha que aparece en el angulo inferior derecho

Hacemos un clic en el elemento que deseamos copiar y obtenemos este resultado

Coo podemos ver todos los formatos han sido copiados con la única excepción del ancho de las columnas.