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

1 comentario:

  1. Muchísimas gracias, tuve un problema con los datos de origen en un archivo que contiene 20 tablas dinámicas y me desconfiguró todas las tablas, acomodé 5, pero me dije voy a ir a consultar a ver si hay algo que me ayude y llegué nuevamente aquí, que he usado sus conocimientos previamente. Gracias por sus aportes. Saludos

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.