将Excel图表粘贴到Powerpoint VBA时出错

时间:2014-08-21 18:49:21

标签: excel vba excel-vba powerpoint powerpoint-vba

我有以下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),一切也能顺利进行。

我认为这可能与设置焦点左右有关。有线索吗?

4 个答案:

答案 0 :(得分:1)

PasteSpecialCommandBars.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)

如果PowerPoint包含Application.Wait消息,则

@ 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