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