我有以下Sub,它假设从excel获取图表并将其粘贴到新创建的PowerPoint幻灯片中。然后它将图表导出为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
当我运行上面的代码时,我得到一个运行时错误:形状(未知成员):无效的请求。剪贴板为空或包含可能未在此处粘贴的数据。这是一行:
pptSlide.Shapes.PasteSpecial DataType:=ppPasteDefault, Link:=msoFalse
Error http://im64.gulfup.com/pZNwxJ.png
我也试过了pptSlide.Shapes.Paste
,但它也犯了同样的错误。
但是,当我将pptApp.Presentations.Add(msoFalse)
修改为pptApp.Presentations.Add
时,只有它可以正常工作,但会显示PowerPoint应用程序。
有趣的是,当我更改为.PasteSpecial DataType:=ppPasteEnhancedMetafile
或.PasteSpecial DataType:=ppPastePNG
时,即使使用.Add(msoFalse)
,一切也能顺利进行。
我认为这可能与设置焦点左右有关。有线索吗?
答案 0 :(得分:1)
PasteSpecial
和CommandBars.ExecuteMso
都应该有效(在Excel / PowerPoint 2010中测试了您的代码,但需要注意以下几点:
添加演示文稿时,您必须将其打开WithWindow:=True
Set pptPres = pptApp.Presentations.Add(msoCTrue)
我做了更多挖掘,你需要使用CopyPicture
方法然后我认为你可以打开withwindow = False
。尝试:
Sub ChartsToPowerPoint()
Dim pptApp As PowerPoint.Application
Dim pptPres As PowerPoint.Presentation
Dim pptSlide As PowerPoint.Slide
Dim objChart As Chart
'Open PowerPoint and create an invisible new presentation.
Set pptApp = New PowerPoint.Application
Set pptPres = pptApp.Presentations.Add(msoFalse)
Set objChart = Worksheets("Sheet1").ChartObjects("Chart 1").Chart
objChart.CopyPicture
Set pptSlide = pptPres.Slides.Add(1, ppLayoutBlank)
pptSlide.Shapes.PasteSpecial DataType:=ppPasteDefault, Link:=msoFalse
'Save Images as png
Path = CreateObject("Wscript.Shell").SpecialFolders("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
答案 1 :(得分:1)
这是将信息从一个Office应用程序复制到另一个Office应用程序时遇到的常见错误。我能形容的最好方法是程序运行太快,我们复制的信息实际上并没有将其写入剪贴板。
这意味着,当我们尝试粘贴时,我们会收到错误消息,因为剪贴板中没有可粘贴的内容。
现在对我们来说幸运的是,有一种方法可以解决此错误,但它要求我们添加额外的一行代码。
#header:hover + .cbp-hrsub {
display: block;
}
现在我要做的只是添加一行额外的代码来暂停您的Excel应用程序一秒钟。这将给它足够的时间来确保信息存储在剪贴板中。 >
您可能会问一个问题,为什么有时会发生这种情况,而其他时候却没有。 好吧,归结为这个问题,剪贴板可能无法正常工作并清除其中的信息。
这就是为什么我们可以避免将信息存储在剪贴板中的原因。但是,在这种情况下,我们无法避免这种情况,因此我们只能忍受不可预测性。
答案 2 :(得分:0)
@ areed1192的答案可能会起作用,但这是Excel的事情。
我可以使用以下技术来做类似的事情:
要说的是,在模块顶部放置一个
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
然后这样称呼它:
Sleep 1000
DoEvents
(我不是很肯定DoEvents会提供帮助,但是如果发生这种情况,在VBA中解决竞争条件似乎是个好主意。)
答案 3 :(得分:0)
sld.Shapes.PasteSpecial数据类型:= 0
或
sld.Shapes.PasteSpecial数据类型:= ppPasteShape