jueves, 7 de abril de 2011

Macro para Copiar y Pegar un rango de Excel en PowerPoint.

Hace un mes aproximadamente subí un post de cómo llevar un rango de celdas de Excel a un documento de Word; en esta ocasión realizaré la misma operación, pero llevaremos nuestro rango de celdas desde Excel hasta un PowerPoint, guardando además el vínculo con los valores (esto es, cualquier modificación en Excel se reflejará en la diapositiva de nuestra presentación en PowerPoint).
En primer lugar deberemos seleccionar una biblioteca de objetos adecuado para nuestro proposito. Después de establecer una referencia a una biblioteca de objetos activando la casilla de verificación situada junto a su nombre, podremos buscar un objeto específico y sus métodos y propiedades en el Examinador de objetos.
Para activar esta referencia deberemos ejecutar el editor de VBA, presionando Alt+F11, y navegando por el menú Herramientas > Referencias seleccionaremos aquellas referencias que sean de utilidad, en nuestro caso Microsoft PowerPoint 11.0 Object Library:

Macro para Copiar y Pegar un rango de Excel en PowerPoint.


Nuestro código VBA a incluir en un módulo del Explorador del proyecto dentro del Editor de VBA es:

Sub Tabla_de_Excel_a_Ppoint()
'La macro copia el rango de Excel seleccionado en PowerPoint

'copiar rango selecionado
Selection.Copy

'objeto para acceder al PowerPoint
Dim ObjPowerPoint As New PowerPoint.Application
'objeto para crear la presentación
Dim Presentacion As PowerPoint.Presentation
'objeto diapositiva
Dim diapositiva As PowerPoint.slide

ObjPowerPoint.Visible = True
Set Presentacion = ObjPowerPoint.Presentations.Add
Set diapositiva = Presentacion.Slides.Add(1, ppLayoutBlank)

'Pegado de las celdas Excel como vínculo
diapositiva.Shapes.PasteSpecial(link:=True).Select

'Libera los objetos PowerPoint
Set ObjPowerPoint = Nothing
Set Presentacion = Nothing
Set diapositiva = Nothing

End Sub


Al ejecutar la macro podemos observar como se abre la aplicación PowerPoint, genera una nueva Presentación y añade una diapositiva en blanco ('ppLayoutBlank'); a continuación pega, a modo de vínculo, con todos los formatos de nuestro rango de celdas en Excel en dicha diapositiva:

Macro para Copiar y Pegar un rango de Excel en PowerPoint.

98 comentarios:

  1. Hola muchas gracias por tu ayuda una pregunta y si quiero pegar otra tabla del mismo archivo de excel pero en otra diapositiva como le hago para dentro del codigo cambiar de diapositiva

    ResponderEliminar
  2. a se me olvidaba tambien si quiero cambiar el tamaño de la imagen copiada en power point por medio del codigo como le hago
    Gracias

    ResponderEliminar
  3. Hola...
    respecto de la primera cuestión de cómo pegar una segunda tabla en otra diapositiva, deberías añadir a partir de la línea 20:
    Application.CutCopyMode = False
    Range("A9:C12").Copy
    Set diapositiva2 = Presentacion.Slides.Add(2, ppLayoutBlank)
    diapositiva2.Select
    diapositiva2.Shapes.PasteSpecial(link:=True).Select

    Para cambiar el tamaño de la imagen copiada en powerpoint se debería proceder de una manera distinta, cambiando el tamaño en Excel antes de pegarlo en Powerpoint con las instrucciones:
    Selection.ShapeRange.ScaleWidth 1.99, msoFalse, msoScaleFromTopLeft
    Selection.ShapeRange.ScaleHeight 1.99, msoFalse, msoScaleFromTopLeft

    La otra forma sería con una macro en Powerpoint... cosa que se me escapa.

    Espero te oriente.
    Un saludo

    ResponderEliminar
  4. Buenas, muy buena la informacion, tengo un problema, yo ya tengo una presentacion creada en powerpoint y quiero que la seleccion de celdas valla justamente a esa diapositiva, hay manera de hacerlo?

    ResponderEliminar
  5. Hola Facundo,
    si, en principio es posible, sin hacer ninguna prueba, el asunto pasaría por reemplazar la parte de la macro
    Set Presentacion = ObjPowerPoint.Presentations.Add
    Set diapositiva = Presentacion.Slides.Add(1, ppLayoutBlank
    por otro codígo del mismo tipo donde le indiquemos que abrimos tu Presentación (como se llame) y la diapositiva concreta...
    Espero haberte orientado.
    Un cordial saludo

    ResponderEliminar
  6. cual seria ese codigo para poder seleccionar la diapositiva que quiero utilizar

    ResponderEliminar
  7. Hola GRS,
    en principio, habría que reemplazar
    Set Presentacion = ObjPowerPoint.Presentations.Add
    Set diapositiva = Presentacion.Slides.Add(1, ppLayoutBlank)
    por
    Presentacion Filename:="tu ruta del Powerpoint\power.ppt"
    diapositiva = Presentacion.Slides.Open(1)

    El '1 sería el número de diapositiva dentro de tu presentación.
    Debería funcionar...
    Slds

    ResponderEliminar
  8. no me resulta si lo hago de esa forma....de que otra manera se puede pegar una tabla de excel en un powerpoint ya existente?

    ResponderEliminar
  9. Hola GRS,
    siempre puedes replicar los movimientos con el asistente de grabación de macros, si es que realmente necesitas realizar esa operación muchas veces...
    Si sólo quieres copiarlo una vez, selecciona el rango en Excel y te vas a tu PowerPoint abierto, y lo pegas en la Diapositiva que quieras... y listo.
    Lo bueno de trabajar entre herramientas de MS-Office es que permite su interrelación.
    De todas formas revisaré el código.
    Slds

    ResponderEliminar
  10. Muchas gracias, pero parece que no me entendiste, el problema es que yo ya tengo una presentacion creada en powerpoint y quiero que la seleccion de celdas valla justamente a esa(s) diapositiva(s), hay otra manera de hacerlo?, ya que la que pusiste un poco mas arriba no resulta...gracias de antemano

    ResponderEliminar
  11. Hola de nuevo...
    intentaré encontrar una respuesta a tu cuestión.
    Slds

    ResponderEliminar
  12. Alguna novedad amigo ExcelForo con respecto al pedido anterior?

    ResponderEliminar
  13. Bueno...
    podrías probar con (y no olvides activa la referencia de MS-powerpoint)
    Sub AbrirPowerPoint()
    Dim PPT As PowerPoint.Application
    Dim diapositiva As PowerPoint.Slide

    'copiar rango selecionado
    Selection.Copy

    Set PPT = New PowerPoint.Application
    PPT.Visible = True

    PPT.Presentations.Open Filename:="ruta\abrirPower.pptx"

    'elegimos la diapositiva 2 de la presentación
    Set diapositiva = PPT.ActivePresentation.Slides(2)

    diapositiva.Select

    'Pegado de las celdas Excel como vínculo
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Set PPT = Nothing
    Set diapositiva = Nothing

    End Sub


    Creo que te funcionará como esperas.
    Un saludo

    ResponderEliminar
  14. bueno antes que nada, muchas gracias por info.

    y si quisiera pegar mi seleccion como TABLA en el powerpoint ? o sea como cuando uno hace control+c y control+v, como seria??

    se que tengo que modificar esta linea, pero no se que poner..

    "diapositiva.Shapes.PasteSpecial(link:=True).Select "

    muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Gerfranc,
      la verdad es que desconozco el código que buscas, según el procedimiento descrito, sólo admite pegar 'formas', por lo que es complicado pegar una 'tabla'...
      Investigaré un poco por la web, por si encuentro algo.
      Siento no haber podido ayudarte.
      Slds

      Eliminar
    2. Muchas gracias por la pronta respuesta!, tengo miedo de haberme expresado mal y haber confundido con mi pregunta,

      lo que ando buscando es copiar y pegar un rango de excel al powerpoint, como cuando haces copy/ paste de forma manual..

      si era lo me habian entendido, disculpas!, seguire intentando mientras tanto

      Saludos y muchas gracias nuevamente

      Eliminar
    3. Que tal Gerfranc,
      entendí lo que preguntabas, pero mis conocimientos de VBA y macros son los justos, de todas formas he estado buscando y no termino de encontrar una respuesta... seguiré intentándolo.
      Un cordial saludo

      Eliminar
  15. Hola, antes que nada muchas gracias de verdad que me ha servido un montón tus respuestas. Pero tengo un problema, tengo un excel con varias hojas, las cuales deben de pegarse en varias diapositivas en el powerpoint. Mi problema es que cuando se llega a pegar la primera tabla ya no pega la 2da, el problema es que la ventana de powerpoint se queda activa. Debería de minimizarse y activarse el excel para pegar la siguiente tabla. En conclusión necesito que el excel vuelva hacer la ventana activa para poder realizar la copia de la siguiente tabla.
    Espero poder haber sido lo suficiente clara. Gracias de antemano!

    ResponderEliminar
    Respuestas
    1. Hola,
      el asunto puede ser complejo, pero básicamente deberías generar un bucle, por ejemplo FOR EACH tablas IN Libro, y dentro de ese bucle ir copiando y generando las nuevas diapositiva.
      Algo así como reviso tabla por tabla y voy creando la diapositiva y pegando la tabla... parecido a
      For Each tabla In librotrabajo
      tabla.Copy
      Dim diapositiva2 As PowerPoint.Slide
      Dim x As Integer
      x = Presentacion.Slides.Count
      Set diapositiva2 = Presentacion.Slides.Add(Index:=x, Layout:=ppLayoutText)
      ObjPowerPoint.ActivePresentation.Slides(x).Select
      diapositiva2.Shapes.PasteSpecial(link:=True).Select
      Next tabla

      Todo con el código previo de identificaciones de PPoint, presentaciones y diapositivas.

      Espero veas la idea.
      Slds

      Eliminar
  16. HOLA AMIGO TENGO QUE DAR UNA PRESENTACION DE EXCEL EN POWERPOINT Y NECESITO COPIAR TODA LA PAGINA DE EXCEL A POWER POINT..
    POR CASUALIDAD NO SABRAN COMO HACERLE?
    GRACIAS!!!!1

    ResponderEliminar
    Respuestas
    1. Hola uan,
      el código sería el mismo que el de este post, en lugar de
      selection.copy
      pondrías
      cells.copy
      lo que te copiaría toda la hoja (incluido celdas en blanco)... pero creo que lo mejor es que emplees
      UsedRange.copy
      para seleccionar sólo el rango usado.
      Slds

      Eliminar
  17. hola amigo excelforo tengo una consulta si quiero Pegar del Excel al powerpoint sin vínculo como si fuese un grafico mejorado como deberia hacerlo ya q si le quito el link o le pongo false sale un error

    ResponderEliminar
    Respuestas
    1. Hola,
      te recomiendo hagas un intento empleando el Asistente de grabación de macros, y veas como actua cuando copias y pegas algo com 'gráfico mejorado', en la misma hoja de Excel.
      Cuando tengass clara la instrucción, simplemente prueba reemplazando esa parte en el código descrito en el post.
      Creo que sería algo así:
      diapositiva.Shapes.PasteSpecial Format:="Imagen (metarchivo mejorado)", Link:= False, DisplayAsIcon:=False
      Slds

      Eliminar
  18. Gracias ExcelForo por tu tiempo una consulta en el post hay una rutina que funciona muy bien selecciona varias celda y lo pega al powerpoint como vinculo lo que quisiera es que pegue al powerpoint pero sin link como una imagen se puede hacer eso?

    ResponderEliminar
    Respuestas
    1. Hola,
      en principio debería funcionar reemplazando el código de copiado por
      diapositiva.Shapes.PasteSpecial Format:="Imagen (metarchivo mejorado)", Link:= False, DisplayAsIcon:=False
      Slds

      Eliminar
  19. amigo ami no me sale lo primero soy nuevo en esto de macros medice ke ay erro y me señala la linea
    diapositiva.Shapes.PasteSpecial(link:=True).Select
    me manda sea producido el error '-2147417851 (80010105)en tiempo de ejecucion y error en el metodo 'pasetespecial'de objeto 'shapes

    ResponderEliminar
    Respuestas
    1. Hola,
      supondré que has marcado las referencias de Librerías de objetos oportunas.
      Luego habría que saber con qué versión de Excel trabajas, ya que estos códigos (donde te falla) son muy problemáticos con versiones anteriores...
      Slds

      Eliminar
    2. trabajo con office 2007 y si habilite las opciones ke indicaste ke devo acer para ke el codigo trabaje

      Eliminar
    3. y gracias eee por tenderme jejee

      Eliminar
    4. gracias ya cambie la vercion tenias razon gracias

      Eliminar
    5. Me alegro finalmente dieras con el fallo.
      Un cordial saludo

      Eliminar
  20. Hola ExcelForo gracias para solucuionar el problema la celda lo converti en grafico dentro del excel y luego lo exporte al Ppt el problema es que manejo al rededor de 200 a 300 hojas de excel y cuando corro el proceso se queda en la hoja 30 o 40 luego tengo que volver a correr la macro para las siguientes 30 o 40 hojas ya que sale este error se ha producido el error '-2147417581(80010105)' en tiempo de ejecución me parece que es un tema de memoria o de ampliar los buffer me podrias ayudar

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      si te funciona correctamente hasta la 30 ó 40, claramente el código es correcta, por lo que aunque no sé que tipo de error es ese (habría que ir a la ayuda de Microsoft para conocer el detalle de éste), si parece que podría ser un tema de memoría.
      Lamentablemente desconozco sobre el tema.
      Lo siento.
      Un saludo y mucha suerte!!

      Eliminar
  21. didiculpa tengo una pregunta ya le ke tengo todo lo de copiado y pegado em powerpoint como puedo hacer ke me borre las tablas ke estan en las hojas de power para ke se peguen sin ningun preoblema nuevas tablas modificadas por ke el codigo solo es para pegarlas pero no te permite borrar para sustituirlas por las nuevas no se si me explico.
    gracias de antemano y en ke parte deve de ir te pongo mi codigo para ke me entiendas mejor

    Sub AbrirPowerPoint()
    Dim PPT As PowerPoint.Application
    Dim diapositiva As PowerPoint.Slide

    'copiar rango selecionado
    Range("B5:C17").Copy

    Set PPT = New PowerPoint.Application
    PPT.Visible = True

    PPT.Presentations.Open Filename:="d:\Users\205491\Desktop\Nueva carpeta (2)\MACRO.pptx"

    'elegimos la diapositiva 2 de la presentación
    Set diapositiva = PPT.ActivePresentation.Slides(1)

    diapositiva.Select

    'Pegado de las celdas Excel como vínculo
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("B5:D17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(2)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("B5:E17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(3)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("B5:F17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(4)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("C5:F17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(5)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("D5:F17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(6)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("E5:F17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(7)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Range("F5:F17").Copy
    Set diapositiva = PPT.ActivePresentation.Slides(8)
    diapositiva.Select
    diapositiva.Shapes.PasteSpecial(link:=True).Select


    Set PPT = Nothing
    Set diapositiva = Nothing

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      yo probaría seleccionando primero la imagen de la diapositiva que quieras borrar en PoerPoint, y luego borraría.
      Probablemente algo así:
      'Para seleccionar la imagen; 'NombreImagen' puede ser una variable
      ActiveWindow.Selection.SlideRange.Shapes('NombreImagen').Select
      'Borramos la imagen seleccionada
      ActiveWindow.Selection.ShapeRange.Delete

      Prueba y me comentas...
      Slds

      Eliminar
    2. NO TE ENTENDI MIRA LO KE KIERO KE ME AYUDES EN LA MISMA MACRO KE TE POSE ME PUEDA BORRAR LAS TABLAS KE EXIXTEN EN POWER Y ME PEGUE LAS KE TENGO EN EXCEL MELAS PEGUE EN POWER ESO ES LO KE KIERO KE ME AGA LA MACRO ME PUEDES AYUDAR GRACIAS DE ANTEMANO Y DISCULPA LAS MOLESTIAS

      Eliminar
    3. Correcto,
      eso es lo que hacen esas líneas que te indiqué...

      Por favor, intenta no escribir en mayúsculas y evita los errores ortográficos... no es fácil leer comentarios así.
      Un cordial saludo

      Eliminar
    4. ok entendido lo checo y te informo como me fue saludos

      Eliminar
  22. Disculpa amigo kiero hacer lo mismo pero con graficas como le puedo hacer o como seria me podrias ayudar por favor

    de ante mano gracias saludos

    ResponderEliminar
    Respuestas
    1. Hola,
      en principio sería el mismo código, sólo tendrías que seleccionar el gráfico... como ves al principio de la macro se hace un selection.copy.
      O bien seleccionas el gráfico, o bien indicas con código qué gráfico estás seleccionando.
      Slds

      Eliminar
  23. ok esta bien pero como lo ago sin ke yo lo seleccione sino ke lo seleccione la misma macro

    ResponderEliminar
    Respuestas
    1. Hola de nuevo,
      suponiendo sepas cómo se llama el gráfico (por ejemplo "1 Gráfico") la línea para copiar ese gráfico sería:
      ActiveSheet.ChartObjects("1 Gráfico").Copy
      que reemplazaría a la de
      Selection.copy
      que comentaba
      Slds

      Eliminar
    2. ok gracias boy a checarlo y te aviso sale

      Eliminar
    3. gracias me sirvio mucho tu ayuda amigo

      Eliminar
  24. Muchas gracias me fue muy util tu informacion!

    ResponderEliminar
  25. Buenas tardes,
    Necesitaría a parte de pegar las excel en una PPT elegir una coordenada concreta en la que pegar el excel y también darle un tamaño definido antes de pegarla. He probado:
    Selection.ShapeRange.ScaleWidth 3.00, msoFalse, msoScaleFromTopLeft
    Selection.ShapeRange.ScaleHeight 3.00, msoFalse, msoScaleFromTopLeft

    Y no me funciona. Utilizo excel 2010.
    Un saludo,

    ResponderEliminar
    Respuestas
    1. Hola,
      bueno, hasta donde yo sé en Excel 2010 esos métodos SclaeWidth y ScaleHeight siguen estándo operativos, y te deberían funcionar...

      Para situar un Shape usa las propiedades Top y Left con un valor en puntos que lo situa respecto a la izquierda y la parte de arriba, con tantos puntos de distancia como indiques.

      Otra cuestión bien diferente es que estos métodos y propiedades actúan sólo sobre la hoja de cálculo, y creo que tu quieres cambiar el tamaño y posición en una diapositiva de PowerPoint.

      Slds

      Eliminar
  26. es posible indicar la posicion del grafico, imagen. dentro del slide?

    ResponderEliminar
    Respuestas
    1. Hola,
      te remito al comentario anterior. Pero no creo sea posible.
      Hasta donde yo sé en Excel 2010 los métodos ScaleWidth y ScaleHeight te deberían funcionar...

      Selection.ShapeRange.ScaleWidth 3.00, msoFalse, msoScaleFromTopLeft
      Selection.ShapeRange.ScaleHeight 3.00, msoFalse, msoScaleFromTopLeft
      Para situar un Shape usa las propiedades Top y Left con un valor en puntos que lo situa respecto a la izquierda y la parte de arriba, con tantos puntos de distancia como indiques.

      Otra cuestión bien diferente es que estos métodos y propiedades actúan sólo sobre la hoja de cálculo, y creo que tu quieres cambiar el tamaño y posición en una diapositiva de PowerPoint.
      Slds

      Eliminar
  27. HELP urgente. Necesito pegar lo que estoy seleccionando de una tabla a través de una macro a una PPT EXISTENTE, pero no me funciona, por favor, que alguien me ayude donde debo ingresar esa sentencia para que pegue la tabla en la ppt existente, adjunto lo que tengo de código:
    Sub Excelpreuba()

    Dim PPApp As PowerPoint.Application
    Dim PPPres As PowerPoint.Presentation
    Dim PPSlide As PowerPoint.Slide

    Set PPApp = CreateObject("Powerpoint.Application")
    PPApp.Visible = True
    Set PPPres = PPApp.Presentations.Add

    '--------------------------------------------------

    'empezamos desde hoja1 hasta el fin de las hojas.
    Sheets("Acts F&F").Select
    For i = 1 To ActiveWorkbook.Sheets.Count

    ' Crea la desde vista dispositiva
    PPApp.ActiveWindow.ViewType = ppViewSlide
    ' se agrega una dispos a la presentation
    Set PPSlide = PPPres.Slides.Add(1, 11)
    Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    'ActiveSheet.ChartObjects(1).CopyPicture
    PPSlide.Shapes.Paste.Select

    ' se acomoda el gráfico pegado
    PPApp.ActiveWindow.Selection.ShapeRange.Left = 15
    PPApp.ActiveWindow.Selection.ShapeRange.Top = 95
    PPApp.ActiveWindow.Selection.ShapeRange.Height = 230


    On Error Resume Next
    ActiveSheet.Next.Select
    Next i
    'se guarda el ppt con nombre de libro excel
    PPApp.ActivePresentation.SaveAs ThisWorkbook.Path & "\" & ActiveWorkbook.Name & ".ppt"
    'se cierra el ppt
    'PPApp.Quit
    Set PPPres = Nothing
    Set PPSlide = Nothing
    Set PPApp = Nothing
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Lola1,
      no sé a qué sentencia te refieres...???
      No he probado el código que aportas, pero parece que recorre las hojas de un libro de Excel y va pegando por hoja en una presentación de PPoint, en diferentes Slides, para acabar cerrando y guardando la presentación con el mismo nombre que el archivo de Excel.
      Si eres más concreta con el problema...
      ;-)
      Slds

      Eliminar
  28. Hola!
    Necesito que me ayudes... sabes he seguido tus instrucciones al pie de la letra y lo que me pasa al copiar esta macro es que me abre un Powerpoint pero en blanco ¿Qué puedo hacer?. Lo que necesito en concreto es que a partir de mi hoja de Excel asigne una macro a un botón para que este botón me mande el gráfico que tengo, en esa hoja, a un Powerpoint. Espero me puedas ayudar, muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Sabastian,
      son dos cosas distintas las que preguntas.
      Una es que sólo te abre una diapositiva de PPoint en blanco, si esto te ocurre es por que no has seleccionado nada, esta macro lleva el rango seleccionado en Excel a una diapositiva. Por tanto selecciona ese gráfico del que hablas, o bien, si sabes su nombre, cambia la primera línea de la macro por la selección del gráfico (con su nombre).
      Lo segundo es asociar la macro a un botón, para esto te remito a esta entrada del blog:
      http://excelforo.blogspot.com.es/2009/09/boton-con-macro-en-excel-2007.html
      Slds

      Eliminar
  29. Hola!
    Gracias por tu pronta respuesta. Te quiero comentar que lo de asignar un botón a una macro me resultó súper bien, lo que no he podido hacer es que me pase el gráfico de Excel a Power Point entonces cómo selecciono el rango de Excel para que pase a Power Point? En que línea exacta, de la macro que propusiste en esta entrada, va? y de qué manera, con alguna formula? Necesito en detalle estas intrucciones ya que es primera vez que programo en VBA por lo cuál no sé demasiado.
    De antemano muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Sebastian,
      cambia del código de esta entrada la línea que pone
      Selection.Copy
      por
      ActiveSheet.ChartObjects("1 Gráfico").ChartArea.Copy

      sólo verifica cómo se llama el gráfico exactamente, o bien, si sólo tienes un gráfico en la hoja activa:
      ActiveSheet.ChartObjects(1).ChartArea.Copy

      el resto del código debería ser igual.
      Slds

      Eliminar
  30. Gracias por resolver mis dudas pero lamentablemente no me resulta, quizás no he sido claro en explicar lo que quiero. De todas maneras te agradezco tu tiempo.
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Sebastian,
      lo que he entendido leyendo tus explicaciones es que quieres copiar un gráfico a una diapositiva de un PowerPoint...
      ¿con las indicaciones que he dado te falla?¿qué error te devuelve?
      Slds

      Eliminar
  31. Lo que me pasa es lo siguiente:
    Primero copio la Macro que está acá publicada, es decir

    Sub Tabla_de_Excel_a_Ppoint()
    'La macro copia el rango de Excel seleccionado en PowerPoint

    'copiar rango selecionado
    Selection.Copy

    'objeto para acceder al PowerPoint
    Dim ObjPowerPoint As New PowerPoint.Application
    'objeto para crear la presentación
    Dim Presentacion As PowerPoint.Presentation
    'objeto diapositiva
    Dim diapositiva As PowerPoint.Slide

    ObjPowerPoint.Visible = True
    Set Presentacion = ObjPowerPoint.Presentations.Add
    Set diapositiva = Presentacion.Slides.Add(1, ppLayoutBlank)

    'Pegado de las celdas Excel como vínculo
    diapositiva.Shapes.PasteSpecial(link:=True).Select

    'Libera los objetos PowerPoint
    Set ObjPowerPoint = Nothing
    Set Presentacion = Nothing
    Set diapositiva = Nothing

    End Sub

    Al copiar esta Macro lo que pasa es que me abre un Ppoint en blanco, por lo cuál te hice la consulta de cómo arreglar esto. Me dijiste que cambiara la línea Selection.Copy, que es la línea 5 de esta Macro, por la línea ActiveSheet.ChartObjects("1 Gráfico").ChartArea.Copy o por ActiveSheet.ChartObjects(1).ChartArea.Copy

    Al realizar este cambio me tira el siguiente error: "Se ha producido el error '438' en tiempo de ejecución: El objeto no admite esta propiedad o método"

    Eso es lo que sucede estimado, por ende no he podido realizar lo que necesito. Gracias una vez más
    Saludos

    ResponderEliminar
    Respuestas
    1. Mejor envíame el fichero con la macro a
      excelforo@gmail.com

      Gracias!!

      Eliminar
  32. Hola, me parece interesante esta macro pero tengo una duda y es que cuando la ejecuto me sale el error:
    diapositiva.Shapes.PasteSpecial(link:=True).Select
    me manda sea producido el error '-2147417851 (80010105)en tiempo de ejecucion y error en el metodo 'pasetespecial'de objeto 'shapes

    yo hago referencia a
    Microsoft PowerPoint 12.0 Object Library:
    y me preguntaba si el codigo seria diferente por el objeto ya que es una nueva version.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Destino7,
      podría ser efectivamente lo que comentas.
      Si trabajas con una versión superior, igualmente puedes activar la librería 11.0.
      Las relaciones entre diferentes aplicaciones de Office son siempre muy delicadas.
      Slds

      Eliminar
  33. Hola buen dia podrian ayudarme con un problema que traigo lo que intento es crear una macro que hipervincule el mismo nombre de una prueba que se encuentran en diferentes hojas, idea es que yo pueda darle clic al nombre y me mande al mismo nombre de la otra hoja y viceversa, intento grabar la maco copiando la celda y luego busco el nombre y despues le doy en pegado especial como hipervinculo, pero a la hora de revisar en visual basic se graba todo excepto el pegar como hipervinculo

    ResponderEliminar
    Respuestas
    1. Hoal Cesar,
      no me queda claro a qué te refieres con 'Nombre'(creo que no es un Nombre definido si no otra cosa.. quizá un valor de una celda o similar).
      En todo caso te copio algunos link donde se explican con macros y sin ellas cómo trabajar con hipervínculos.
      http://excelforo.blogspot.com.es/2011/06/como-desplazarse-por-las-hojas-de-un.html
      http://excelforo.blogspot.com.es/2012/08/vba-un-hipervinculo-con-macros-de-excel.html
      http://excelforo.blogspot.com.es/2013/03/mas-de-la-funcion-hipervinculo-de-excel.html
      http://excelforo.blogspot.com.es/2011/06/hipervinculo-asociado-un-desplegable-de.html

      Espero alguna de las explicaciones se adapte a tu pregunta.
      Slds cordiales

      Eliminar
  34. Hola buenos días, ¿podrían ayudarme? tengo una presentación ya armada y el archivo de excel que me muestra toda la información, el problema esta en que necesito ligar una etiqueta (rectangulo) de powerpoint con una celda en excel, para que me muestre el valor de la celda en excel y se quede con el mismo formato de powerpoint ¿Esto es posible? Muchas gracias,

    ResponderEliminar
    Respuestas
    1. Hola Luís Alfonso,
      lo más pareceido que se me ocurre es que podrías copiar como imagen una celda/objeto, y pegar 'especial' como vínculo en PowerPoint...

      Espero te sirva la idea... es la misma que la expuesta en esta entrada.

      Slds

      Eliminar
  35. Hola Ismael, No se si me puedes ayudar, y creo que tampoco va muy relacionado con el tema aqui expuesto. Estoy tratando de crear un macro para hacer la presentacion en PPT, pero quiero que solo pegue los graficos de una sola hoja de excel y que no me recorra todas las hojas. Te coloco a continuacion la macro, para que la observes.
    Sub CreatePowerPoint()

    'Variable Definitions
    Dim filePPT As PowerPoint.Application
    Dim slide As PowerPoint.slide
    Dim worksheetXLS As Excel.Worksheet
    Dim graphic As Excel.ChartObject

    'Run PowerPoint.Application
    Set filePPT = New PowerPoint.Application

    'Create a PowerPoint Presetation
    filePPT.Presentations.Add

    'Lookup all Graphics in MnthRep
    worksheetXLS = Worksheets("MnthRep")
    For Each graphic In worksheetXLS.ChartObjects

    'Add new slide
    filePPT.ActivePresentation.Slides.Add _
    filePPT.ActivePresentation.Slides.Count + 1, ppLayoutBlank
    filePPT.ActiveWindow.View.GotoSlide _
    filePPT.ActivePresentation.Slides.Count
    Set slide = filePPT.ActivePresentation.Slides( _
    filePPT.ActivePresentation.Slides.Count)

    'Copy Graphic in Slide
    worksheetXLS.ChartObjects(graphic.Index).Chart.CopyPicture
    slide.Shapes.Paste.Select

    'Reduce Graphic Size and Centre in the Slide
    filePPT.ActiveWindow.Selection.ShapeRange.ScaleHeight 0.5, msoScaleFromMiddle
    filePPT.ActiveWindow.Selection.ShapeRange.ScaleWidth 0.5, msoScaleFromMiddle

    Next

    'Delete all created instances
    Set slide = Nothing
    Set filePPT = Nothing
    Set graphic = Nothing
    Set worksheetXLS = Nothing

    End Sub

    Mut agradecido de antemano por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola,
      este código te copia los gráficos de la Hoja1 en una Nueva presentación, cada gráfico en una Diapositiva... El único problema es situar lo copiado centrado.
      Sub Grafico_de_Excel_a_Ppoint()
      Dim graphic As Excel.ChartObject
      Dim ObjPowerPoint As New PowerPoint.Application
      Dim Presentacion As PowerPoint.Presentation
      Dim diapositiva As PowerPoint.slide

      ObjPowerPoint.Visible = True
      Set Presentacion = ObjPowerPoint.Presentations.Add
      For Each graphic In Worksheets("Hoja1").ChartObjects
      Set diapositiva = Presentacion.Slides.Add(1, ppLayoutBlank)

      Worksheets("Hoja1").ChartObjects(graphic.Index).Chart.CopyPicture
      diapositiva.Shapes.Paste
      Next

      Set ObjPowerPoint = Nothing
      Set Presentacion = Nothing
      Set diapositiva = Nothing
      End Sub

      Espero te oriente en tu problema.
      Suerte
      Slds

      Eliminar
    2. Ismael, de verad muy agardecido por tu ayuda. Un millon de gracias, de verdad.
      Saludos,
      Carlos

      Eliminar
    3. Ismael, otra pregunta, y disculpa la molestia.
      Con la macro que me diste, como puedo hacer para pegar dos graficos en una misma hoja?

      Eliminar
    4. Hola Carlos!
      puedes aplicar lo que respondí justo en el comentario siguiente...
      y para aplicarlo en una Slide en particular indícalo con el número indice que corresponda, por ejemplo a la Slide 3
      'Abrimos la Presentación
      Set PPpres = PP.Presentations.Open("E:\NombreProyecto.pptx")
      'indcamos qué copiar
      Sheets("Hoja2").Range("A1:C10").Copy
      'y lo pegamos en la diapositiva número 3
      PPpres.Slides(3).Shapes.Paste

      Con el recorrido de Gráficos por hoja lo podrás copiar en la Slide que quieras...

      Un saludo

      Eliminar
    5. Hola Ismael,
      Dejame ver si entendi!

      Esta parte de la mcro quedaria igual?
      Dim Graphic As Excel.ChartObject
      Dim ObjPowerPoint As New PowerPoint.Application
      Dim Presentation As PowerPoint.Presentation
      Dim Slide As PowerPoint.Slide

      En esta parte de la macro:

      ObjPowerPoint.Visible = True
      Set Presentation = ObjPowerPoint.Presentations.Add
      For Each Graphic In Worksheets("MnthRep").ChartObjects
      Set Slide = Presentation.Slides.Add(1, ppLayoutBlank)

      Cambiaria: Set presentation por SetPPpres =PP.Presentations.Open(Ruta)
      Tambien cambiaria: Set Slide = Presentation.Slides.Add(1, ppLayoutBlak) por Sheets("Hoja2").Range("A1:C10").Copy. O en mi caso por el grafico(s)que quiero pegar!
      Es correcto? O estoy equivocado?
      Esto creo que sigue igual
      Worksheets("MnthRep").ChartObjects(Graphic.Index).Chart.CopyPicture
      Slide.Shapes.Paste

      Next

      Set ObjPowerPoint = Nothing
      Set Presentation = Nothing
      Set Slide = Nothing

      End Sub
      Muy Agradecido por tu ayuda.
      Carlos

      Eliminar
    6. Hola,
      quedaría así
      Sub test_pegado_Graficos()
      Dim graphic As Excel.ChartObject
      Dim PP As PowerPoint.Application
      Dim PPpres As PowerPoint.Presentation
      'objeto para acceder al PowerPoint y hacerlo visible
      Set PP = New PowerPoint.Application
      PP.Visible = msoCTrue
      'Abrimos la presentación en quequeremos copiar los gráficos
      Set PPpres = PP.Presentations.Open("E:\Excelforo\Borrar.pptx")
      For Each graphic In Sheets("Hoja1").ChartObjects
      'indicamos dónde está el gráfico a copiar
      Set Sh = Worksheets("Hoja1").ChartObjects(graphic.Index).Chart
      'lo copiamos
      Sh.CopyPicture
      'y pegamos en la diapositiva deseada , en este caso la 1ª
      PPpres.Slides(1).Shapes.Paste
      Next graphic
      Set Sh = Nothing
      Set PP = Nothing
      Set PPpres = Nothing
      End Sub

      Slds

      Eliminar
  36. Buenas tardes,

    Ante todo muchas gracias por vuestra ayuda.

    Mi cuestión es como hacer una macro que me pegue en un power point diferentes tablas y graficos que están en diferentes hojas del Excel, y mas o menos se hacerlo pero me atasco cuando quiero decir a la macro que me seleccione "tal rango" de "tal hoja" en la diapositva numero 3 por ejemplo.

    Muchas gracias,
    Saludos,

    ResponderEliminar
    Respuestas
    1. Hola, gracias por tus palabras.
      me alegra mi aportación te hay resultado alguna vez de ayuda.

      Respecto a tu cuestión para seleccionar un rango concreto de una hoja sólo aplica algo del estilo
      Sheets("Hoja2").Range("A1:C10").Copy

      y para aplicarlo en una Slide en particular indícalo con el número indice que corresponda, por ejemplo a la Slide 3
      'Abrimos la Presentación
      Set PPpres = PP.Presentations.Open("E:\NombreProyecto.pptx")
      'indcamos qué copiar
      Sheets("Hoja2").Range("A1:C10").Copy
      'y lo pegamos en la diapositiva número 3
      PPpres.Slides(3).Shapes.Paste

      Esa es un poco la idea, es algo diferente al modelo que he explicado en esta entrada.
      Espero te oriente
      Slds

      Eliminar
  37. Ismael, muchas gracias de nuevo. Tienes algun correo electronico al que me pueda comunicar contigo?

    ResponderEliminar
  38. Hola, estoy usando tu macro para copiar un rango de excel y pegarlo en power point 2010. En mi PC sólo tengo las librerías 12 y 14. Sabes cómo puedo solucionar mi problema? Porque a mí al igual que a Destino 7 me sale el error error '-2147417851 (80010105)en tiempo de ejecucion y error en el metodo 'pasetespecial'de objeto 'shapes.

    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola Laura,
      bueno, como le dije a Destino7 es cuestión de versiones...
      Intentaré buscar el código para Office 2010 y subirlo.
      Saludos cordiales

      Eliminar
    2. Hola Ismael, me ayudarías un montón. Gracias!!!

      Eliminar
  39. Buenas tardes... muchas gracias por compartir su conocimiento... mi pregunta es:
    es posible ejecutar una macro que se encuentra guardada en un archivo de powerpoint y la quiero ejecutar desde excel

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Giovanni,
      en teoría si es posible...
      te dejo este link de Microsoft donde 'explica' más o menos algo al respecto:
      http://support.microsoft.com/kb/177760/es

      Espero te clarifique las dudas.
      Slds

      Eliminar
  40. Estimado agradezco de antemano tu aporte, es muy valioso,
    Tengo una pequeña consulta, no me está funcionando la macro que he tratado de adecuar a mi necesidad, lo que sucede es simplemente que la macro pega todos los gráficos a la dispositiva 2, y lo que requiero es que pegue cada gráfico en cada diapositiva, tengo una plantilla PPT de 12 diapositivas en la cual deseo que se peguen las gráficas

    Agradeceré infinitamente que me pueda apoyar ya que llevo 3 días en este dilema y no puedo solucionarlo, soy nuevo en macros

    Gracias de antemano

    aqui le dejo mis códigos

    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


    'Creamos una presentación PowerPoint
    Set PPT = New PowerPoint.Application
    PPT.Visible = True
    PPT.Presentations.Open Filename:="C:\Documents and Settings\AsistDatCom\Mis documentos\Proyecto 5\PPT_COLEGIO_AE_2015_nuevo.pptx"

    'Instancia del objeto PowerPoint.Application
    Set diapositiva = PPT.ActivePresentation.Slides(2)

    diapositiva.Select


    'Recorrer tods los gráficos en nuestro libro de Excel
    For Each hojaXLS In ThisWorkbook.Worksheets
    For Each grafico In hojaXLS.ChartObjects


    'Copiar gráfico en la dispositiva
    hojaXLS.ChartObjects(grafico.Index).Chart.CopyPicture
    diapositiva.Shapes.Paste.Select



    'Centramos la imagen insertada
    PPT.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, msoTrue
    PPT.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

    ResponderEliminar
    Respuestas
    1. Hola Christian,
      el asunto es que tendrás que crear tantas Slides como gráficos tengas... por tanto deberías aprovechar el bucle que recorre las hojas y gráficos, para llevar un contador.. y emplear ese contador para agregar una Slide nueva por cada gráfico que encuentre....
      En esencia es la misma macro que tienes, pero cambiando un poco el orden y añadiendo ese contador...

      Saludos cordiales

      Eliminar
  41. Hola

    Gracias por tu ayuda ... tengo el siguiente codigo , resulta que quiero pegar la celda J7:J7 a una ubicacion exacta en power point

    Te lo agradezco mucho

    Sub Tabla_de_Excel_a_Ppoint()
    'La macro copia el rango de Excel seleccionado en PowerPoint

    'copiar rango selecionado
    'Selection.Copy

    Application.CutCopyMode = False
    Range("J7:J7").Copy

    Set PPT = New PowerPoint.Application
    PPT.Visible = True

    PPT.Presentations.Open Filename:="C:\Users\CO1020771801\Documents\TAREAS\TAREA6 PLAN MENSUAL\Avance\Capitulo_Avance-Fisico.pptx"

    'elegimos la diapositiva 2 de la presentación
    Set diapositiva = PPT.ActivePresentation.Slides(1)

    diapositiva.Select

    'Pegado de las celdas Excel como vínculo

    diapositiva.Shapes.PasteSpecial(link:=True).Select

    Set PPT = Nothing
    Set diapositiva = Nothing

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Nathalia,
      en un comentario de este post (del 26/10/2012) se aporta una forma de situar lo copiado en una posición concreta, empleando las propiedades Top y Left (y Height):

      ' se acomoda el gráfico pegado
      PPApp.ActiveWindow.Selection.ShapeRange.Left = 15
      PPApp.ActiveWindow.Selection.ShapeRange.Top = 95
      PPApp.ActiveWindow.Selection.ShapeRange.Height = 230

      Espero te pueda servir.
      Saludos

      Eliminar
  42. Muchas Gracias , me queda una duda que significa el 15 , 95 y el 230 son cm ?? medidos desde donde ?

    ResponderEliminar
    Respuestas
    1. Las medidas suelen ser en puntos, y en este caso Left y Top se miden desde la parte superior izquierda..
      Puedes ver respecto de medidas en
      http://excelforo.blogspot.com.es/2014/09/unidades-de-medida-para-excel.html
      Saludos

      Eliminar
  43. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  44. Muchas Gracias por tu colaboracion , en caso de necesitar copiar una celda de unahoja que no este activa , como seria ?

    he usado lo siguiente pero no me funciona
    resulta que estaba cambiando la linea del codigo Range("B26:B26").Copy
    por la siguiente Worksheets("Nombre de hoja".Range("B26:B26").Copy


    Muchas Gracias

    ResponderEliminar
    Respuestas
    1. pues debería funcionar (cerrando el paréntesis):
      Worksheets("Nombre de hoja").Range("B26").Copy
      o también
      Sheets("Nombre de hoja").Range("B26").Copy
      Slds

      Eliminar
  45. Hola

    De antemano Gracias por tu colaboracion

    si deseo guardar el archivo estoy usando este codigo

    PPApp.ActivePresentation.SaveAs ("C:\Users\CO1020771801\Documents\TAREAS\TAREA6 PLAN MENSUAL\Avance\ " & Proyecto & ".pptx")

    pero resulta que no me esta guardando con ese nombre sino sobre el archivo que estoy trabajando

    Te agradeceria mucho

    ResponderEliminar
    Respuestas
    1. Hola Nathalia,
      mejor lee primero las Normas de uso del blog, y después si quieres, envíame tu proyecto a
      excelforo@gmail.com

      Un cordial saludo

      Eliminar
  46. Hola Ismael gracias por la informacion, una pregunta actualmente tengo Office 2013 y la libreria es "Microsoft PowerPoint 15.0" y la macro se detiene al momento de pegar la imagen "diapositiva.Shapes.PasteSpecial(Link:=True).Select", que me recomiendas hacer.?

    ResponderEliminar
    Respuestas
    1. Hola Omar,
      cambia la sentencia por:
      diapositiva.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile

      debería funcionar...
      Un saludo!

      Eliminar
  47. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  48. Este comentario ha sido eliminado por el autor.

    ResponderEliminar