Crear presentación PowerPoint con VBA

Excel es una gran herramienta para el manejo de datos y la creación de gráficos, pero cuando llega el momento de hacer una presentación en público generalmente utilizamos PowerPoint por los beneficios que ofrece a los presentadores. Sin embargo el proceso de copiar y pegar los gráficos de Excel a una presentación PowerPoint puede ser tardado y muy repetitivo.

Hoy aprenderemos como llevar todos los gráficos contenidos en un libro de Excel hacia una presentación PowerPoint con solo ejecutar una macro y en el proceso aprenderemos un poco más de VBA.  Así que sin más preámbulos comencemos a escribir código.

Librería de Objetos PowerPoint

Para poder utilizar las instrucciones VBA que nos permiten interactuar con PowerPoint es necesario agregar una referencia hacia la Librería de objetos de PowerPoint. Para hacerlo abrimos el Editor de Visual Basic y vamos a la opción Herramientas > Referencias y se mostrará el cuadro de diálogo Referencias.

Librería de objetos PowerPoint

Busca la librería llamada Microsoft PowerPoint Object Library. En mi caso tengo instalada la versión 14.0 que se refiere a la versión de PowerPoint 2010. Una vez seleccionada la librería haz clic en el botón Aceptar y estaremos listos para utilizar los objetos de PowerPoint desde nuestra macro en Excel.

Macro para crear archivo PowerPoint

El primer paso en la creación de la macro será insertar un nuevo módulo de código para colocar la subrutina que para este ejemplo he llamado CrearPowerPoint. Las primeras líneas de código las utilizaremos para definir las variables de nuestra macro.

Crear archivo PowerPoint desde VBA

Las variables que utilizaremos son las siguientes:

  • archivoPPT: variable que tendrá una referencia al objeto PowerPoint.Application el cual nos permite interactuar con PowerPoint
  • diapositiva: variable que representará una diapositiva dentro de la presentación PowerPoint
  • hojaXLS: variable que contendrá una referencia  a un objeto Excel.Worksheet y que será de utilidad para recorrer todas las hojas de nuestro libro.
  • grafico: variable que hará referencia a un objeto que representará cada gráfico del libro de Excel.

Continuando con la construcción de la macro, agregaré un par de instrucciones para crear una instancia del objeto PowerPonit.Application en la variable archivoPPT y posteriormente crearé la presentación PowerPoint:

Macro para crear archivo PowerPoint

Copiar cada gráfico a una diapositiva

Una vez que hemos creado la presentación debemos centrarnos en la parte más importante de nuestra macro que es el bucle que recorrerá todas las hojas del libro Excel y por cada gráfico encontrado insertará una nueva diapositiva en la presentación PowerPoint para posteriormente copiar el gráfico de Excel:

Crear presentación PowerPoint desde Excel con VBA

Puedes observar dos bucles For Each. El primero es para recorrer todas las hojas del libro y el segundo para recorrer todos los gráficos dentro de una misma hoja. De esta manera, no importa la cantidad de gráficos que tengas en cada hoja, la macro insertará una diapositiva para cada uno de ellos. Después de crear la diapositiva se copiará el gráfico y finalmente se hace el centrado de la imagen dentro de la diapositiva.

Comprobación de la macro

Tengo un archivo de Excel que tiene 2 hojas y tres gráficos que están distribuidos de la siguiente manera. La hoja Temperatura tiene 1 gráfico y la hoja Viento tiene 2 gráficos:

Insertar gráficos de Excel en PowerPoint con VBA

Para ejecutar la macro voy a la ficha Programador, pulso el botón Macros y selecciono la macro recién creada. Como resultado obtengo una presentación de PowerPoint que contiene una diapositiva para cada uno de los gráficos del libro de Excel:

PowerPoint generado con VBA desde Excel

De esta manera hemos copiado todos los gráficos de un libro de Excel a una presentación de PowerPoint de manera automática. Es muy importante recordar que la presentación PowerPoint creada por la macro no está almacenada en disco duro por lo que es necesario guardar el archivo desde PowerPoint. Para obtener el código VBA creado en este ejemplo puedes descargar el libro de Excel que he utilizado o puedes copiar el código que coloco a continuación:

Sub CrearPowerPoint()

'Definición de variables
Dim archivoPPT As PowerPoint.Application
Dim diapositiva As PowerPoint.Slide
Dim hojaXLS As Excel.Worksheet
Dim grafico As Excel.ChartObject

'Instancia del objeto PowerPoint.Application
Set archivoPPT = New PowerPoint.Application

'Creamos una presentación PowerPoint
archivoPPT.Presentations.Add

'Recorrer tods los gráficos en nuestro libro de Excel
For Each hojaXLS In ThisWorkbook.Worksheets
    For Each grafico In hojaXLS.ChartObjects
    
        'Agregar nueva diapositiva
        archivoPPT.ActivePresentation.Slides.Add _
            archivoPPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
        archivoPPT.ActiveWindow.View.GotoSlide _
            archivoPPT.ActivePresentation.Slides.Count
        Set diapositiva = archivoPPT.ActivePresentation.Slides( _
            archivoPPT.ActivePresentation.Slides.Count)
                
        'Copiar gráfico en la dispositiva
        hojaXLS.ChartObjects(grafico.Index).Chart.CopyPicture
        diapositiva.Shapes.Paste.Select
        
        'Centramos la imagen insertada
        archivoPPT.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, msoTrue
        archivoPPT.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, msoTrue
        
    Next
Next

'Eliminamos las instancias creadas
Set diapositiva = Nothing
Set archivoPPT = Nothing
Set grafico = Nothing
Set hojaXLS = Nothing

End Sub

55 pensamientos en “Crear presentación PowerPoint con VBA

  1. JLUIS

    que mas puedo decir yo la mayor parte de mi trabajo lo realizo en excel y es una muy buena macro gracias

  2. CarlosR2

    Gracias Maestro, excelente aporte el cual desconocia totalmente, ahora podre desarrollar con menor esfuerzo y mejor calidad mis presentaciones.

  3. Antonio

    Maravilloso, como de costumbre. Gracias por hacernos disfrutar del trabajo.

  4. julio contreras

    Estimado Moisés

    muchas gracias, un maestro, que al entregar, aprende más.
    saludos, desde Temuco-Chile

  5. Mao

    Moises, quiero felicitarte por esa habilidad de trasmitir el conocimiento de forma tal que a pesar de no ser experto en el tema de VBA lo comprendo.

    He estado siguiendo tus notas desde hace como un año y en mucho el aprendizaje que tenido. Incluso no pense que fuera posible hacer este tipo de macro, tienes mucho conocimiento para hacer aplicaciones de este tipo, muchas gracias por compartir lo que sabes.

  6. Marisol R

    Gracias por compartir excelente herramienta, ahorra mucho tiempo.Saludos!

  7. Daniel

    Excelente, muy útil.

  8. Juan Ramon

    Moises, en verdad me dejaste con los ojos cuadrados, ni idea tenía poder hacer este tipo de presentaciones de esta manera y la verdad me ayuda muchísimo en mi trabajo. Como bien dicen los comentarios anteriores, eres un maestro.
    Muchas gracias por tus aportaciones, espero que sigas así por mucho tiempo, compartiéndonos tus conocimientos para que así, nosotros también compartirlos más adelante y a otras generaciones.
    Felicidades maestro!!!.

  9. Victor

    Excelente explicación, solo que no me muestra el PPT. Me sale un mensaje que dice: Error de compilación: No se ha definido el tipo definido por el usuario. A qué se refiere y cómo puedo solucionarlo.
    Gracias.

    1. Moisés Ortíz Autor

      Hola Víctor, es probable que hayas olvidado crear la referencia a la librería de Power Point. Asegúrate de seguir los pasos mencionados en el artículo dentro de la sección Librería de Objetos Power Point.

  10. victor Manuel Jimenez Urbina

    Esta excelente fue una de la cosas que me preguntaba si se podian hacer todos estos programas son increibles y eres muy bueno manejandolos gracias me sera muy util en mi trabajo saludos que estes bien

  11. Fabiola

    Buen dia quiero agradecerle todas las aportaciones que hace diariamente me encanta trabajar con el excel y me gustaria conocer un poco mas del lenguaje VBA para realizar macros. Me podra apoyar de favor. Y nuevamente gracias por todo

  12. Saúl

    Hola.
    Siguiendo tus aportaciones no tengo duda que seré un usuario avanzado de Excel. Gracias por tomarte el tiempo de compartir tu conocimiento.
    Saludos desde El Salvador

  13. Ángel Plascencia

    Excelente aportación!
    En verdad ésta página me encanta por los excelentes aportes!

    Saludos cordiales

  14. ALberto

    hace unos años que manejo Excel, tenia mi pagina para apoyar a muchas personas como tu, pero por tiempo ya no pude, que gusto ver que hay personas iguales que no piden nada a cambio.
    Buen aporte, esto mismo manejo actualmente. Y lo que mas uso son Graficas Dinamicas (con botones, casillas y combos de seleccion) seria genial ver eso por aqui.

    Saludos desde Monterrey.

  15. RAYVALMAL

    buenos dias te comento que la ejecuto y me carca un error en
    For Each hojaXLS In ThisWorkbook.Worksheets

    1. Moisés Ortíz Autor

      Hola RAYVALMAL, en esta macro estoy suponiendo que tienes gráficos en tu libro de Excel. Agrega al menos un gráfico y vuelve a intentar.

  16. Antonio Lara

    Excelente! cada vez se ponen mejor los temas, no queda mas que practicar para dominar estas poderosas herramientas! muchas gracias por los aportes y lecciones!!

  17. Larry Quintana

    Excelente…este tema de las macros es muy interesante y gracias a tus aportaciones cada
    día aprendo más y más. Sin duda alguna excelente aportación.

  18. Nelson Guzmán

    Saludo y bendiciones Don Moisés, usted que de verdad es una montaña de conocimiento y no es egoísta, nos facilita todas las cosas posibles de excel y sus afines. Necesito saber si en este macro que excelentemente usted nos transmite, se pueden usar en la presentaciones de PP textos, cálculos, formulas,etc., del libro o de la hoja que tomemos como origen para la formación de la estructura del macro….Por ejemplo, si tengo una hoja en donde planteo análisis de situaciones relativas a la economía en sentido general, como puedo hacer que me funcione con su nueva macro en PP. Gracias anticipadas… Dr. Guzmán.

    1. Moisés Ortíz Autor

      Hola Nelson, Gracias por tu comentario. Es totalmente factible crear texto en la presentación e incluir cálculos hechos en Excel. Para agregar un cuadro de texto podrías utilizar la siguiente instrucción:
      diapositiva.Shapes.AddTextbox(Type:=msoTextOrientationHorizontal, Left:=100, Top:=100, Width:=200, Height:=50).TextFrame.TextRange.Text = “Nuevo Texto”

      El objeto “diapositiva” es el objeto PowerPoint.Slide que utilizo en la macro de ejemplo. Es solo para darte una idea de cómo insertar un cuadro de texto con VBA.

  19. Franklin Rodriguez

    Siempre me sorprendes con algo Nuevo.

  20. Andrés Vélez

    Te aclaro que uso Office 2013.
    Corri el ejemplo que nos dejaste pero cuando va a copiar las gráficas de la segunda hoja se detiene y pide depurar la siguiente linea: diapositiva.Shapes.Paste.Select.
    La ejecución de apertura de una nuevo power point lo hace bien, agrega tres slides nuevos, pega el primero pero después de esto se detiene.

    1. Moisés Ortíz Autor

      Hola Andrés, el ejemplo lo hice con Excel 2010 y no lo he probado aún en la versión 2013.
      Cuando tenga algún tiempo disponible lo revisaré para detectar los problemas con la nueva versión de Excel.

  21. Honorio

    Gracias por toda la información que nos da. Ni siquiera MIcrosoft ofrece tanta información como usted. A usted lo deberían contratar en esa empresa para explicar y hacer lo que hace con excel

    1. Juan Carlos

      Comparto totalmente lo de “Ni siquiera Microsoft ofrece tanta información…”
      Moisés son un teso, como decimos en Colombia..
      Felicidades!!

  22. Jefferson

    Mi estimado gracias por esta macro es excelente.

  23. jeans

    excelente es de mucha ayuda

  24. fernando rodriguez

    !!!! MAESTROOOO !!!! NO ME LA SABIA !!! VOY A PRACTICAR CON ALGUNAS COSAS TOMANDO TU EJEMPLO…. GRACIAS POR EL APORTE……..FELICIDADES POR LA PAGINA, ES EXCELENTE…

  25. mauricio pinos

    Perfecto, me llega esta macro en el momento preciso, gracias, saludos desde Ecuador.

  26. Valent

    Gracias por compartir será de gran utilidad.

  27. Roberston

    Muy agradecido por tu aporte, es una herramienta muy util y facilita el trabajo, de veras es genial.

  28. Carlos Asin Matta

    Excelente, gracias por el aporte y la sencillez de sus explicaciones, todos los temas son importantisimos. Le solicitaria si podria dar mas ejemplos sobre macros y el uso con visual basic en cuanto a la programación dentro de excel.

    Que Dios lo bendiga.

  29. Carlos Aguilar

    Excelente aporte, justo eso necesito para un trabajo importante que tengo que presentar.
    Tengo una duda, hay alguna forma de la diapositiva sea pre-diseñada (tengo que presentar el trabajo con una diapositiva estantar de corporación)

    1. Moisés Ortíz Autor

      Hola Carlos, habría que cambiar el código para que en lugar de crear una nueva presentación se utilice un archivo existente el cual debería tener el diseño corporativo.

  30. Julio

    Buenas tardes, en mi trabajo utilizamos mucho Excel y generalmente de ahí compiamos áreas completas con tablas y comentarios para pegarlas como imagen en PP, ¿existe la posibilidad de que con este macro selecciones algunas áreas de las Hojas de Cálculo y las pegue como Imágen en PP?

    Muchas gracias

    1. Moisés Ortíz Autor

      Hola Julio, puedes utilizar la siguiente instrucción para copiar el rango como imagen:
      hojaXLS.Range(“A1:D4″).CopyPicture xlScreen, xlBitmap

      Después lo pegas con la misma instrucción que uso en la macro:
      diapositiva.Shapes.Paste.Select

  31. Marce

    Hola Moises, me gustaría saber si además de las gráficas hay una forma de pegar las tablas o los informes que tengo en el excel, todas las semanas tengo que enviar una presentación, basada en informes y gráficos que hago en excel, pero es muy dispendioso copiar y pegar cada hoja

    1. Moisés Ortíz Autor

      Hola Marce, por supuesto que es posible automatizarlo, pero no podría explicarte todo el detalle en este comentario. Te puedo adelantar que para copiar un rango de celdas puedes utilizar una instrucción como la siguiente:
      hojaXLS.Range(“A1:J20″).CopyPicture xlScreen, xlBitmap

  32. Carla

    Buen día maestro, soy poco experta con VBA, tengo una información en excel sobre el desarrollo del negocio en la empresa, es muy amplia y cada dos semanas debo presentar los datos a la junta pero cada vez debo pegar los datos como mapa de bits en la presentación ppt, hay alguna forma de hacerlo con VBA. Muchas gracias quedo atenta

    1. Moisés Ortíz Autor

      Hola Carla, es posible hacerlo. Por favor lee los dos comentarios anteriores (Julio y Marce) donde hago una recomendación para insertar rangos de datos en PowerPoint.

  33. Javier Toledo

    Moisés, gracias por el aporte de conocimiento. Tengo una necesidad similar, de migrar datos (tablas) y gráficos de Excel a PPT y creo que esto la resuelve. Por otro lado, desde una aplicación en .NET (VBasic) hicimos el equivalente de copiar tablas y funcionó bien mientras estaba en la PC de desarrollo.
    El detalle es que al momento de publicarlo en el servidor, marcaba error de ruta y de que no estaba la librería registrada. Superamos eso, y hasta donde llegamos, es que indica un error de que no puede abrir el archivo de la plantilla PPT que le indicamos.
    Inicialmente era por permisos, lo cambiamos de carpeta, registramos permisos para el usuario de ASP, el de web, etc sin lograr superarlo.
    ¿Alguna idea de qué pueda estar fallando?
    Gracias por la atención.

    1. Moisés Ortíz Autor

      Javier, tu problema tiene que ver con desarrollo .NET más que con Excel y VBA pero aún así te daré mi sugerencia.
      En general los pasos a seguir son los que mencionaste, registrar la librería en el servidor y posteriormente dar permisos al usuario correspondiente. Debes investigar el usuario asignado al Application Pool de tu aplicación de manera que ese sea el usuario al que le das permisos. En IIS 7 frecuentemente será la cuenta Network Service.

  34. Oscae Ayalr

    Saludos moises Excelente Aporte. Fijate que Exporto el Modulo y Luego Lo importo como Modulo en otra Hoja de Excel y me marca ” Error de Compilacion No se ha definido el Tipo Definido por el Usuario” y Si habro tu Libro de Excel y ejecuto la macro que mandaste en mi Libro Funciona. Me podrias decir que me Falta xfa Gracias

    1. Moisés Ortíz Autor

      Hola Oscae, tal vez te falte agregar la referencia a la Librería de Objetos PowerPoint como lo muestro al inicio del artículo.

  35. Mauro Urquijo

    Hola Moisés
    Excelente artículo. Tengo una necesidad de editar un texto de una diapositiva ya existente. Tú me podrías ayudar por favor con una pequeña línea de código que haga referencia a una caja de texto ya existente por ejemplo en la diapositiva número 9? Lo tengo resuelto cuando adiciono una nueva diapositiva pero lo que necesito es editar ya una existente
    Muchísimas gracias

    1. Moisés Ortíz Autor

      Hola Mauro, el siguiente código es un ejemplo de cómo podrías hacerlo para una presentación PowerPoint ya existente:
      Dim oPPT As Presentation
      Set oPPT = ActivePresentation
      Set oPPT = oPP.Presentations.Open(“c:ejemplo.ppt”)
      oPPTApp.ActivePresentation.Slides(9).Shapes(“Texto”).TextFrame.TextRange.Text

  36. Carlos

    Estimado Moises,
    Gracias por su ayuda con este material. Muy instructivo. Ahora una pregunta, como hago para exportar los graficos, pero de una sola hoja de Excel y no de todo el libro? Segundo, si mi grafico en Excel es mas grande que la hoja de presentacion de PPT, como puedo hacer para reducirlo de tamaño?
    Agradecido de antemano.

    1. Moisés Ortíz Autor

      Hola Carlos, debes remover el bucle For Each de manera que la macro no recorra todas las hojas del libro y en su lugar hacer que el objeto hojaXLS haga referencia a la hoja que deseas consultar.
      hojaXLS = Worksheets(“Hoja1″)

      Para modificar el tamaño del objeto a insertar modifica las propiedades ScaleHeight y ScaleWidth, por ejemplo:
      archivoPPT.ActiveWindow.Selection.ShapeRange.ScaleHeight 0.5, msoTrue, msoScaleFromMiddle
      archivoPPT.ActiveWindow.Selection.ShapeRange.ScaleWidth 0.5, msoTrue, msoScaleFromMiddle

  37. xavi

    Impresionante!!!! Muy útil.
    ¿Como se haría lo mismo pero con plantillas pps que tuviesen un formato? Ej: Colores, logo corporativo…
    Gracias y saludos

  38. oscar ayala

    Saludos Moises como le podria hacer para que esta macro haga referencia a otros libros abiertos y cree las presentaciones de las graficas de esos libros. Por que hasta ahora solo crea del Libro donde esta la macro. De antemano Gracias

    1. Moisés Ortíz Autor

      Hola Oscar, debes utilizar el siguiente método:
      Workbooks.Open Filename:=”c:libro.xlsx”

      Una vez abierto el libro podrás hacer referencia a sus hojas a través del objeto ActiveWorkbook para extraer las gráficas.

  39. Mariana

    Hola! Buenisima la macro, muchas gracias!
    Tengo un problema, cuando el grafico es la hoja completa no lo reconoce para pasarlo a la macro, como se puede hacer?
    Gracias!

    1. Moisés Ortíz Autor

      Hola Mariana, si te refieres a que el gráfico está en su propia Hoja de Gráfico, el problema se debe a que dichas hojas no están dentro de la colección Worksheets y por lo tanto no son consideradas.
      Eso se soluciona si utilizas la colección Sheets de manera que el bucle For Each haga el recorrido sobre ThisWorkbook.Sheets en lugar de ThisWorkbook.Worksheets.