The below Sub is supposed to paste an Excel chart into a newly created PowerPoint slide. It then exports the chart as a PNG:
Sub ChartsToPowerPoint()
Dim pptApp As PowerPoint.Application
Dim pptPres As PowerPoint.Presentation
Dim pptSlide As PowerPoint.Slide
'Open PowerPoint and create an invisible new presentation.
Set pptApp = New PowerPoint.Application
Set pptPres = pptApp.Presentations.Add(msoFalse)
'Set the charts and copy them to a new ppt slide
Set objChart = Worksheets("Sheet1").ChartObjects("Chart 1").Chart
objChart.ChartArea.Copy
Set pptSlide = pptPres.Slides.Add(1, ppLayoutBlank)
pptSlide.Shapes.PasteSpecial DataType:=ppPasteDefault, Link:=msoFalse
'Save Images as png
path = "C:\Users\xyz\Desktop\"
For j = 1 To pptSlide.Shapes.Count
With pptSlide.Shapes(j)
.Export path & j & ".png", ppShapeFormatPNG
End With
Next j
pptApp.Quit
Set pptSlide = Nothing
Set pptPres = Nothing
Set pptApp = Nothing
End Sub
I get a Run-time error:
Shapes (unknown member): Invalid request. Clipboard is empty or contains data which may not be pasted here.
At the line:
pptSlide.Shapes.PasteSpecial DataType:=ppPasteDefault, Link:=msoFalse
Error http://im64.gulfup.com/pZNwxJ.png
I tried pptSlide.Shapes.Paste
but it gives the same error.
When I amend pptApp.Presentations.Add(msoFalse)
to pptApp.Presentations.Add
only it works but the PowerPoint App is displayed.
When I change to .PasteSpecial DataType:=ppPasteEnhancedMetafile
or .PasteSpecial DataType:=ppPastePNG
everything runs smoothly even with .Add(msoFalse)
.
I am thinking it might be something to do with setting the focus or so.
sld.Shapes.PasteSpecial DataType:=0
or
sld.Shapes.PasteSpecial DataType:=ppPasteShape
PasteSpecial
andCommandBars.ExecuteMso
should both work (tested your code in Excel/PowerPoint 2010 with the following caveat:When you add presentation, you have to open it
WithWindow:=True
I did some more digging, you need to use the
CopyPicture
method and then I think you can open withwindow=False
. Try:@areed1192's answer might work if PowerPoint had an Application.Wait message, but that's an Excel thing.
I was able to do something similar by using a technique found here:
Which is to say, put a the top of the module:
And then call it like this:
(I'm not positive the DoEvents helped, but it seemed like it might be a good idea for resolving a race condition in VBA if that's what's going on.)
This is a common error we can experience when we copy information from one Office application to another. The best way I can describe it is that the program runs too fast and the information we copy never actually makes it into our clipboard.
This means that when we go and try to paste it, we get an error because there is nothing in our clipboard to paste.
Now lucky for us there is a way to fix this error but it requires us to add an extra line of code.
Now all I did was add an extra line of code that pauses your Excel application for one second. This will give it enough time to make sure that the information is stored in your clipboard.
You might be asking the question why does this happen sometimes but then not other times. Well, it just boils down to this the clipboard can act unpredictably and clear out information inside of it.
That's why if we can avoid storing the information in the clipboard we try to. However, in this case, we can't avoid it so we just have to live with the unpredictability.