Forum Discussion

Aditya Jadhav's avatar
Aditya Jadhav
Brass Contributor
Jan 08, 2019
Solved

Excel charts to Powerpoint exporting using VBA

Hi,

 

Can anyone share a code which can be used to copy and paste all the charts from a workbook to a powerpoint presenatation. Have about 95 different charts on different sheets in the workbook. Have searched for a macro but none has worked for me.

If anyone can share a code that can export all the charts it would really help me save my work.

 

Regards,

Aditya 

  • Hi,
    please try the sample code below:

     

    Public Sub ChartsToPpt()
      Dim sht As Object
      Dim cht As Excel.ChartObject
      Dim appPpt As Object 'PowerPoint.Application
      Dim prs As Object 'PowerPoint.Presentation
     
      'Create New Presentation
      Set appPpt = CreateObject("PowerPoint.Application")
      appPpt.Visible = msoTrue
      Set prs = appPpt.Presentations.Add(msoTrue)
     
      For Each sht In ActiveWorkbook.Sheets
        If sht.Visible = xlSheetVisible Then
          sht.Select
          Select Case LCase(TypeName(sht))
            Case "worksheet"
              For Each cht In sht.ChartObjects
                cht.Select
                Application.CommandBars.ExecuteMso "Copy"
                PasteChart appPpt, prs
              Next
            Case "chart"
              Application.CommandBars.ExecuteMso "Copy"
              PasteChart appPpt, prs
          End Select
        End If
      Next
    End Sub

    Private Sub PasteChart(ByVal PowerPointApplication As Object, _
                           ByVal TargetPresentation As Object)
      Dim sld As Object 'PowerPoint.Slide
      Dim cnt As Long
      Const ppLayoutBlank = 12
     
      Set sld = TargetPresentation.Slides.Add( _
        TargetPresentation.Slides.Count + 1, ppLayoutBlank) 'Add New Slide
      sld.Select
      cnt = sld.Shapes.Count
     
      PowerPointApplication.CommandBars.ExecuteMso "PasteExcelChartSourceFormatting"
      Do
       DoEvents
      Loop Until cnt <> sld.Shapes.Count
    End Sub

     

    -------------

     

    Public Sub ChartsToPptAsImage()
      Dim sht As Object
      Dim cht As Excel.ChartObject
      Dim appPpt As Object 'PowerPoint.Application
      Dim prs As Object 'PowerPoint.Presentation
     
      'Create New Presentation
      Set appPpt = CreateObject("PowerPoint.Application")
      appPpt.Visible = msoTrue
      Set prs = appPpt.Presentations.Add(msoTrue)
     
      For Each sht In ActiveWorkbook.Sheets
        If sht.Visible = xlSheetVisible Then
          Select Case LCase(TypeName(sht))
            Case "worksheet"
              For Each cht In sht.ChartObjects
                cht.CopyPicture Appearance:=xlScreen, _
                                Format:=xlBitmap
                PasteChartImage prs
              Next
            Case "chart"
              sht.ChartArea.Copy
              PasteChartImage prs
          End Select
        End If
      Next
    End Sub

    Private Sub PasteChartImage(ByVal TargetPresentation As Object)
      Dim sld As Object 'PowerPoint.Slide
      Const ppLayoutBlank = 12
      Const ppPasteBitmap = 1
     
      Set sld = TargetPresentation.Slides.Add( _
        TargetPresentation.Slides.Count + 1, ppLayoutBlank) 'Add New Slide
      With sld.Shapes.PasteSpecial(DataType:=ppPasteBitmap, Link:=msoFalse)
        .Align msoAlignCenters, True
        .Align msoAlignMiddles, True
      End With
    End Sub

     

    hope this helps.
    kinuasa

13 Replies

  • kinuasa's avatar
    kinuasa
    Brass Contributor

    Hi,
    please try the sample code below:

     

    Public Sub ChartsToPpt()
      Dim sht As Object
      Dim cht As Excel.ChartObject
      Dim appPpt As Object 'PowerPoint.Application
      Dim prs As Object 'PowerPoint.Presentation
     
      'Create New Presentation
      Set appPpt = CreateObject("PowerPoint.Application")
      appPpt.Visible = msoTrue
      Set prs = appPpt.Presentations.Add(msoTrue)
     
      For Each sht In ActiveWorkbook.Sheets
        If sht.Visible = xlSheetVisible Then
          sht.Select
          Select Case LCase(TypeName(sht))
            Case "worksheet"
              For Each cht In sht.ChartObjects
                cht.Select
                Application.CommandBars.ExecuteMso "Copy"
                PasteChart appPpt, prs
              Next
            Case "chart"
              Application.CommandBars.ExecuteMso "Copy"
              PasteChart appPpt, prs
          End Select
        End If
      Next
    End Sub

    Private Sub PasteChart(ByVal PowerPointApplication As Object, _
                           ByVal TargetPresentation As Object)
      Dim sld As Object 'PowerPoint.Slide
      Dim cnt As Long
      Const ppLayoutBlank = 12
     
      Set sld = TargetPresentation.Slides.Add( _
        TargetPresentation.Slides.Count + 1, ppLayoutBlank) 'Add New Slide
      sld.Select
      cnt = sld.Shapes.Count
     
      PowerPointApplication.CommandBars.ExecuteMso "PasteExcelChartSourceFormatting"
      Do
       DoEvents
      Loop Until cnt <> sld.Shapes.Count
    End Sub

     

    -------------

     

    Public Sub ChartsToPptAsImage()
      Dim sht As Object
      Dim cht As Excel.ChartObject
      Dim appPpt As Object 'PowerPoint.Application
      Dim prs As Object 'PowerPoint.Presentation
     
      'Create New Presentation
      Set appPpt = CreateObject("PowerPoint.Application")
      appPpt.Visible = msoTrue
      Set prs = appPpt.Presentations.Add(msoTrue)
     
      For Each sht In ActiveWorkbook.Sheets
        If sht.Visible = xlSheetVisible Then
          Select Case LCase(TypeName(sht))
            Case "worksheet"
              For Each cht In sht.ChartObjects
                cht.CopyPicture Appearance:=xlScreen, _
                                Format:=xlBitmap
                PasteChartImage prs
              Next
            Case "chart"
              sht.ChartArea.Copy
              PasteChartImage prs
          End Select
        End If
      Next
    End Sub

    Private Sub PasteChartImage(ByVal TargetPresentation As Object)
      Dim sld As Object 'PowerPoint.Slide
      Const ppLayoutBlank = 12
      Const ppPasteBitmap = 1
     
      Set sld = TargetPresentation.Slides.Add( _
        TargetPresentation.Slides.Count + 1, ppLayoutBlank) 'Add New Slide
      With sld.Shapes.PasteSpecial(DataType:=ppPasteBitmap, Link:=msoFalse)
        .Align msoAlignCenters, True
        .Align msoAlignMiddles, True
      End With
    End Sub

     

    hope this helps.
    kinuasa

    • Vin_Philips's avatar
      Vin_Philips
      Copper Contributor

      kinuasa Thanks for the code.

       

      I wanted to understand if we can tweak the code in such a way that the ppt which is uploaded on sharepoint gets updated with graphs?

      In real time the graphs will get placed in the dedicated slide without having to generate a new PPT file each time we execute the code.

       

      Is it possible?

       

      thanks in advance

      • Enri9111's avatar
        Enri9111
        Copper Contributor

        @kinuasa would you be so kind to help me with my VBA code? The code above you have already provided works wonderfully, however for my specific needs I would need to copy each chart of in a specific pp page and also define the dimension and right place in the pp. can you help mw with this?

    • moeboe's avatar
      moeboe
      Copper Contributor

      kinuasa Hi tried running this and the message  i got was: (i already had ppt opened with no new presentation, and also tried with new presentation)

       

    • skosmas's avatar
      skosmas
      Copper Contributor

      kinuasaFirst of all, thank you for the useful VBA codes. I transferred my charts to my customized powerpoint template  of the company  that I work for as images, but the size of the images is larger than the template that I use. How I can customize the size of the images  ? Can you give as a code that one can change the size of the images that transfers?

      Thank you in advance,

      Sotiris from Athens, Greece

Resources