Todo aquel que realiza informes periódicos sabe lo aburrido que puede llegar a ser volcar los resultados gráficos de Excel a PowerPoint. En mi caso particular es una tarea que me lleva aproximadamente una hora todas las semanas… pero hay una persona del equipo que dedica prácticamente un día entero.
En este tutorial os explicamos como automatizar la tarea de copiar un gráfico de Excel a PowerPoint con VBA. No es una tarea sencilla puesto que requiere mucho tiempo de ajuste de los parámetros… pero no son difíciles de realizar, es una cuestión de prueba y error.
Explicación general
Este ejercicio se compone de dos archivos (tal y como yo lo tengo configurado). Uno de los archivos es el PowerPoint donde pegaremos los gráficos (y tablas… que también se puede) y el otro es el Excel desde el que llevaremos los datos a PowerPoint.
Dentro del Excel tendremos un módulo con tres macros:
- Macro principal para abrir el archivo de PowerPoint
- Macro secundaria para copiar un gráfico
- Macro secundaria para copiar una tabla
En VBA de Excel deberemos añadir la librería de objetos de PowerPoint: Microsoft Office PowerPoint Library. Para realizar esto es muy sencillo. En la pantalla de VBA ir a Herramientas (tools) >> References (referencias) y seleccionar del listado. Esto nos permitirá usar desde Excel los objetos de PowerPoint (para poder abrir un powerpoint, ir a una slide en concreto y usar las propiedades necesarias para pegar las imágenes).
Para este tutorial de como copiar un gráfico de Excel en PowerPoint con VBA hemos creado:
- una presentación de PowerPoint que se llama “Template ExcelyVBA”
- y un libro de Excel llamado “Copiar de Excel a PowerPoint” con dos hojas: análisis y datos donde en cada una hay una tabla y un gráfico diferentes para poder realizar este ejemplo.
Macro principal
Como ya hemos comentado, esta macro nos permitirá abrir el archivo de PowerPoint “Template ExcelyVBA” e irá llamando a las otras dos macros para seleccionar los archivos de Excel y pegarlos en el PowerPoint como imágenes.
Las siguientes líneas de código para la macro principal son las siguientes:
Sub GeneraInformePPT() ' NOTA: Necesita habilitar en Herramientas−Referencias las librerias Microsoft PowerPoint Library ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Parametros ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' rutaActual = ThisWorkbook.Path rutaPlantilla = rutaActual & "\Template ExcelyVBA.pptx" 'IMPORTANTE La plantilla del informe debe estar en el mismo path que el excel ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Apertura el ppt y comprobaciones ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Se abre el Powerpoint si no estuviera abierto If ppApp Is Nothing Then Set ppApp = New PowerPoint.Application ppApp.Visible = True 'Comprobamos que la presentacion existe y que no este vacia On Error Resume Next Set ppPresentation = ppApp.Presentations.Open(rutaPlantilla) On Error GoTo 0 If ppPresentation Is Nothing Then MsgBox "La plantilla " & rutaPlantilla & " no se encuentra en la ruta especificada", vbCritical Exit Sub End If 'Comprobamos que la presentacion no este vacia If ppPresentation.Slides.Count = 0 Then MsgBox "La plantilla " & rutaPlantilla & " está vacia", vbCritical Exit Sub End If Call Copiar_Tabla("Analisis", "B4:C11", 2, 0, −40) Call Copiar_Tabla("Datos", "D4:G18", 3, 50, −50) Call Copiar_Grafico("Analisis", "Grafico_Analisis", 4, 25) Call Copiar_Grafico("Datos", "Grafico_Datos", 5, 50) End Sub
Al final de esta macro vemos que hay 4 llamadas (“Call”) a otras dos macros: Copiar_Tabla y Copiar_Grafico. Estas macros se explican a continuación.
Macro para copiar gráfico
Esta macro es el núcleo duro de este pequeño desarrollo y aquí es donde está la “chicha” del asunto. En la macro utilizamos los diferentes parámetros de configuración que necesitemos y se los pasamos desde la macro principal. Los parámetros usados son:
- Hoja en la que se encuentra el gráfico
- Nombre del gráfico en el Excel
- Número de slide donde vamos a copiar el gráfico
- Distancia a la que queremos poner la imagen del centro en la vertical
Otras variables que podíamos haber utilizado son: el desplazamiento lateral desde el centro de la slide, el escalado de la imagen… y otras muchas que pueden llegar a ser necesarias en ejercicios más complejos.
El código utilizado es el siguiente:
Private Sub Copiar_Grafico(hoja As String, nombre_graf As String, hoja_objetivo As Integer, _ dist_top As Integer) 'Seleccionamos la grafica octaedro Sheets(hoja).ChartObjects(nombre_graf).Activate ActiveChart.ChartArea.Copy 'Copiamos la grafica Set ppSlide = ppPresentation.Slides(hoja_objetivo) ppApp.ActiveWindow.View.GotoSlide hoja_objetivo 'Pasamos todas las variables With ppSlide.Shapes.PasteSpecial(ppPasteEnhancedMetafile) .Align msoAlignLefts, msoTrue .Align msoAlignCenters, True .Align msoAlignMiddles, True .IncrementTop (dist_top) End With End Sub
Este pedazo de código no hay que repetirlo, trabaja como una función a la que le pasamos los parámetros desde la macro principal y que nos irá haciendo el trabajo de copiar los gráficos en nuestro PowerPoint.
Macro para copiar rango de celdas como imagen
También podremos copiar un rango de celdas desde Excel a PowerPoint como una imagen. Esta opción puede ser de gran ayuda en el caso de que tengamos datos que mostrar de esta manera. El código empleado es muy similar al anterior con la salvedad de que lo que copiamos es un rango y no un objeto.
Private Sub Copiar_Tabla(hoja As String, rango_tabla As String, slide_objetivo As Integer, _ dist_top As Integer, dist_left As Integer) 'Copiamos las tablas como imagen Sheets(hoja).Select Sheets(hoja).Range(rango_tabla).Select Selection.Copy 'Copiamos la grafica Set ppSlide = ppPresentation.Slides(slide_objetivo) ppApp.ActiveWindow.View.GotoSlide slide_objetivo 'Pasamos todas las variables With ppSlide.Shapes.PasteSpecial(ppPasteEnhancedMetafile) .ScaleWidth 1.1, msoFalse .Align msoAlignRights, msoTrue .Align msoAlignCenters, msoTrue .Align msoAlignMiddles, True .IncrementTop (dist_top) .IncrementLeft (dist_left) End With End Sub
Ejemplo real para copiar un gráfico de Excel a PowerPoint con VBA
Pero es de todos conocido que “si no lo veo no lo creo” así que os dejo aquí los dos archivos necesarios para poder hacer esto. Podéis usarlos de base para vuestras macros.
No olvides colocarlos en la misma carpeta, sino, esta macro fallará.