lunes, diciembre 28, 2009

JLD en Castellano – balance del cuarto año

El tiempo vuela (o como diría mi profesora de Latín, tempus fugit). En unos días concluirá esta primera decena del siglo 21 y ha llegado el momento de presentar las estadísticas del blog a mis socios, sus lectores.

A pesar del título de la nota, sólo llevo estadísticas completas desde el año 2007 (gracias a los servicios de Statcounter), por lo que estaremos analizando estos últimos tres años.




En el 2009 470,000 lectores han visto casi 950,000 páginas. Esto significa un crecimiento de algo más del 11% en lectores y del 4% en las páginas vistas.

El blog ha seguido creciendo, conteniendo ahora 418 entradas que han merecido algo más de 3400 comentarios (incluyendo mis respuestas).

Estas estadísticas nos dan poca información así que decidí, siguiendo la corriente de mis últimas notas, organizar los datos en un dashboard





El gráfico en la sección izquierda del tablero nos permite comparar datos mensuales por año





La lista desplegable en el encabezado nos permite visualizar distintos tipos de datos y analizar sus tendencias.

Así vemos que el número de páginas vistas en el 2009 se ha mantenido estable, mientras que en el 2007 el crecimiento fue acelerado y la desaceleración empezó en el 2008.

Vemos que el número de visitantes se ha comportado de la misma manera




Otro efecto notable es que la cantidad de lectores y páginas vistas tiende a descender en los meses de julio y agosto (el verano en Europa), alcanza el máximo del año en Octubre para caer “en picada” en Noviembre y Diciembre.

Para agregar más información a partir de los mismos datos, he agregado cuatro gráficos, uno para cada tipo de datos, que muestran las tendencias de los tres años








He agregado líneas de tendencia para hacerlas más evidentes. En todo los casos vemos que la tendencia es ascendente pero también podemos observar que los últimos meses están por debajo de la línea de tendencia.
Podemos ver que el 2009 se diferencia en su comportamiento de los años anteriores y que ningún mes logro superar las cifras del 2008. Espero que esta tendencia se revierta en el año entrante.
Donde ha habido un gran crecimiento es en la cantidad de lectores del feed (de 30 en enero del 2007 a 1307 en diciembre del 2009).





Sólo me queda por desear a mis lectores lo mejor para el 2010 y agradecer a todos por el apoyo, por los halagos (a veces inmerecidos) y también por las (por lo general merecidas) observaciones.

Salud!

pd.: quien haya descargado alguno de los tableros anteriores (dashboard-1 o dashboard-2) y quiera recibir el archivo del tablero de esta nota sólo tiene enviarme un mail usando la misma dirección usada para la descarga.




martes, diciembre 22, 2009

Evitar borrar Validación de datos en Excel al pegar datos copiados

Empiezo con una aclaración: por primera vez he eliminado una entrada luego de haberla publicado. Se trata de la entrada donde mostraba un código para evitar el problema de la destrucción de la validación de datos al pegar un valor copiado de otra celda. Había demasiadas circunstancias que provocaban que el código no funcionara. Mea culpa!

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

En esta cuarta nota mostraremos el uso de otra herramienta importante para la construcción de tableros de comandos: la función IMPORTARDATOSDINAMICOS.

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: