jueves, noviembre 05, 2015

Como crear una presentación Power Point a partir de un cuaderno Excel

Empiezo este post con una aclaración: la autoría del concepto de esta nota y del código son de Mike Alexander y fue publicado en su blog hace unos años atrás.

Como muchos de los posts de este blog, la idea surgió a partir de la inquietud de uno de mis colegas de trabajo. Como muchos de los lectores de este blog, mi colega recoge, transforma, analiza datos y finalmente crea reportes. Estos reportes incluyen, además de tablas, gráficos. El producto final suele ser una presentación PowerPoint, donde pega los gráficos que quiere presentar.
La tarea de pasar los gráficos de Excel a la presentación PowerPoint puede ser engorrosa y tiene sus bemoles, ya sea que los peguemos como imágenes o los liguemos al cuaderno Excel.
Con un poco de código Vba podemos automatizar el proceso de crear una presentación PowerPoint a partir de un cuaderno Excel.

La idea central es crear un cuaderno donde manejamos los datos de los gráficos. Luego creamos hojas, una para diapositiva de la presentación, definiendo el rango de celdas que contiene el gráfico y los elementos que queremos que aparezcan en la diapositiva. El rango debe ser el mismo para todas las hojas. También podemos crear una hoja para el título (la primer diapositiva).

En este ejemplo he creado un cuaderno con cuatro hojas, una para el título de la presentación y las tres restantes para mostrar las ventas por mes de las sucursales


El rango D1:O24 contiene lo que queremos que aparezca en cada una de las diapositivas de la presentación.

Finalmente activamos el código siguiente que creará una presentación de PowerPoint, con una diapositiva por cada hoja del cuaderno:


Sub WorkbooktoPowerPoint()

'Paso 1:  Declarar variables
    Dim pp As Object
    Dim PPPres As Object
    Dim PPSlide As Object
    Dim xlwksht As Worksheet
    Dim MyRange As String
    Dim MyTitle As String
    Dim SlideCount As Integer

'Paso 2:  Abrir PowerPoint, agregar una nueva presentacion
         'y volverla visible visible
    Set pp = CreateObject("PowerPoint.Application")
    Set PPPres = pp.Presentations.Add
    pp.Visible = True
 

'Paso 3:  Definir el rango de las hojas que contiene la diapositiva
    MyRange = "D1:O24"

'Paso 4:  Empezar el loop por las hojas del cuaderno
    For Each xlwksht In ActiveWorkbook.Worksheets
    xlwksht.Select
    Application.Wait (Now + TimeValue("0:00:1"))

'Paso 5:  Copiar el rango como imagen
    xlwksht.Range(MyRange).CopyPicture _
    Appearance:=xlScreen, Format:=xlPicture

'Paso 6:  Contar las diapositivas y agregar una nueva
        '(el numero 12 representa la enumeracion para una
        'diapositiva en blanco)
    SlideCount = PPPres.Slides.Count
    Set PPSlide = PPPres.Slides.Add(SlideCount + 1, 12)
    PPSlide.Select
        
'Paso 7:  Pegar la imagen y ajustar la posicion
    PPSlide.Shapes.Paste.Select
    pp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
    pp.ActiveWindow.Selection.ShapeRange.Top = 50
    pp.ActiveWindow.Selection.ShapeRange.Left = 1
    pp.ActiveWindow.Selection.ShapeRange.Width = 700

 
    Next xlwksht
     
'Paso 8:  Limpiar la memoria
    pp.Activate
    Set PPSlide = Nothing
    Set PPPres = Nothing
    Set pp = Nothing
              
End Sub


Este video muestra el proceso de creación de la presentación


lunes, noviembre 02, 2015

Algebra booleana y Excel (las funciones Y, O, XO, NOT)

Google celebra los 200 años del nacimiento de George Boole con este doodle

Mis avisados lectores habrán notado las funciones Excel AND (Y en la versión española de Excel), XOR (XO), OR (O) y NOT (NO).

George Boole es considerado el padre del álgebra booleana, una de las bases de la informática. Excel, por supuesto, permite realizar operaciones booleanas contando para eso con las funciones mencionadas (XO disponible en Excel 2013 y posterior).

Me voy a permitir celebrar también el acontecimiento con una breve reseña de estas funciones y algunos de sus usos.

Las funciones booleanas evalúan un número de condiciones y dan como resultado los valores lógicos VERDADERO o FALSO.

Función
Resultado
Observaciones
Y (AND)
VERDADERO si todos los argumentos se evalúan como VERDADERO; devuelve FALSO si uno o más argumentos se evalúan como FALSO.

O (OR)
VERDADERO si alguno de los argumentos es VERDADERO; devolverá FALSO si todos los argumentos son FALSOS.

XO (XOR)
Devuelve un O exclusivo lógico de todos los argumentos (ver el ejemplo más adelante).
Disponible a partir de Excel 2013
NO (NOT)
Invierte el valor lógico del argumento.



Estas funciones nos permiten combinar varias condiciones y evaluar si todas se cumplen, si algunas o ninguna.

En esta hoja muestro la evaluación de tres condiciones en una lista de nombres



Las funciones Y y O son intuitivas. La fórmula en la celda F8 es =Y(C8=$B$4,D8=$C$4,E8>$D$4); podemos ver que sólo una condición se cumple (mayor de 25) por lo que el resultado es FALSO (FALSE). En cambio el resultado en la celda G8, que contiene la fórmula =O(C8=$B$4,D8=$C$4,E8>$D$4), es VERDADERO (TRUE) ya que una de las condiciones se cumplen.

La función XO es menos intuitiva. Como regla general digamos que si el número de condiciones que se cumplen (VERDADERO) es impar el resultado es VERDADERO y si el número es par entonces el resultado es FALSO.
Para dar otro ejemplo del uso de XO supongamos que tenemos una lista de trabajadores donde se señalan los turnos trabajados, mañana y tarde. Si para saber quien ha trabajado jornada parcial usamos la fórmula =XO(C3,D3) en la tabla del ejemplo


Comparar listas con Power Query

Para el analista de datos, comparar listas en Excel es una tarea frecuente. Las distintas técnicas de comparar listas en Excel que hemos visto a lo largo de la historia de este blog van desde el uso de formato condicional, pasando por la función COINCIDIR, la herramienta Datos-Consolidar hasta el uso de Access y por  supuesto usando Vba (macros).

En este post vamos a mostrar cómo usar Power Query (Excel 2010 o posterior) para la tarea. La gran ventaja de usar Power Query es que obtenemos los resultados de la comparación en una nueva lista en forma inmediata.

Supongamos que tenemos dos listas de países con sus respectivos PBI. La primer lista proviene del CIA World Factbook; la segunda de las Naciones Unidas.

Para obtener estas listas hemos usado también el Power Query (Data Catalog Search). Podemos por supuesto usar todo tipo de lista en una hoja de Excel a condición que los hayamos definido previamente como Tabla.


Una vez cargadas las listas en hojas de Excel (también podemos crear la conexión sin necesidad de cargar la lista en una hoja), podemos ver en el panel de edición del Query que las listas no tienen la misma cantidad de países


Ahora queremos saber qué países en la lista de la CIA no aparecen en la lista de las Naciones Unidas y viceversa.

Para realizar la comparación vamos a usar la herramienta Merge del Power Query.



Seleccionamos la primer lista (CIA World Factbook) y con un clic marcamos el campo en común con la segunda tabla (Country/Region); hacemos lo mismo con la segunda tabla y en la ventanilla de tipo de unión (Join Kind) elegimos "Left Anti". Por Left (izquierda) señalamos la primer tabla; de la misma manera Right (derecha) indica la segunda tabla.
Apretamos OK y obtenemos es resultado en la ventana del Query


Podemos ver que la consulta resulta en 16 países o regiones en la lista de la CIA que no aparecen en la de las Naciones Unidas. Podemos eliminar la columna "New Column" y cambiar el nombre de la consulta a algo más significativo. Apretamos Close&Load para poner la consulta en una hoja del cuaderno.
Para obtener la lista de países que aparecen en las Naciones Unidas y no en la CIA, usamos el mismo proceso cambiando el orden de las tablas en la consulta y usando el tipo de unión Left Anti

Esta consulta resulta en 9 países/regiones en la lista de las Naciones Unidas que no aparecen el la lista de la CIA

Como en el caso anterior podemos eliminar la columna "NewColumn" y pasar la consulta a una hoja del cuaderno.

Ahora tenemos una hoja con 16 países/regiones que aparecen en la lista de CIA y no en la de las Naciones Unidas y otra de 9 países/regiones que aparecen en las Naciones Unidas y no en la CIA. Esto explica la diferencia de 7 países/regiones (16-7; 218 - 211) que vimos al comparar las listas