Vba 将图表从Excel复制到PowerPoint的脚本出错

Vba 将图表从Excel复制到PowerPoint的脚本出错,vba,excel,Vba,Excel,我试图调用下面的子命令,以便将给定图表复制到指定的PowerPoint演示文稿。但是,当我运行调用此子对象的宏时,下面指示的行返回以下错误:“对象不支持此属性或方法。”奇怪的是,Shapes和Slide都包含调用的方法。此外,位图被正确复制到我的剪贴板,并在调用错误之前粘贴到幻灯片中。您将在下面找到Sub() Sub-copyChart(chrt作为图表,pres作为PowerPoint.Presentation) 像幻灯片一样模糊的光标,像幻灯片一样模糊的滑块 设置dummySlide=pre

我试图调用下面的子命令,以便将给定图表复制到指定的PowerPoint演示文稿。但是,当我运行调用此子对象的宏时,下面指示的行返回以下错误:“对象不支持此属性或方法。”奇怪的是,Shapes和Slide都包含调用的方法。此外,位图被正确复制到我的剪贴板,并在调用错误之前粘贴到幻灯片中。您将在下面找到Sub()

Sub-copyChart(chrt作为图表,pres作为PowerPoint.Presentation)
像幻灯片一样模糊的光标,像幻灯片一样模糊的滑块
设置dummySlide=pres.Slides(2)'第二张幻灯片是虚拟幻灯片。
设置curSlide=dummySlide.Duplicate(1)'Duplicate dummy,设置为当前幻灯片。
chrt.CopyPicture外观:=xlScreen,格式:=xlBitmap'将图表复制为图片。

curSlide.Shapes.Paste'看起来错误可能是由于VBA如何处理不同引用中的变量造成的。(特别是PPT VBA如何处理它们。)我能够通过主动选择/复制图表使宏工作。我需要做更多的研究来弄清楚为什么变量会导致问题,但至少我知道如何解决这个问题

Sub copyChart(curSlide As Slide)
    Dim chr as ChartObject
    Set chr = Sheets("CHARTSHEET").ChartObjects(1)  
    Sheets("CHARTSHEET").Select
    ActiveChart.CopyPicture
    curSlide.Shapes.PasteSpecial
End Sub

看起来这个错误可以归因于VBA如何处理不同引用中的变量。(特别是PPT VBA如何处理它们。)我能够通过主动选择/复制图表使宏工作。我需要做更多的研究来弄清楚为什么变量会导致问题,但至少我知道如何解决这个问题

Sub copyChart(curSlide As Slide)
    Dim chr as ChartObject
    Set chr = Sheets("CHARTSHEET").ChartObjects(1)  
    Sheets("CHARTSHEET").Select
    ActiveChart.CopyPicture
    curSlide.Shapes.PasteSpecial
End Sub

我喜欢使用另一种方法,我喜欢定义一个
对象
,然后将其设置为粘贴的图表。之后,在PowerPoint(从Excel)中修改粘贴的图表对象的参数就容易多了

见下面的代码:

Sub copyChart(curSlide As Slide)

Dim chr             As ChartObject
Dim myChart         As Object

Set chr = Sheets("CHARTSHEET").ChartObjects(1)
chr.Copy

' setting myChart object to the pasted chart (let's me later an easy way to modify it's parameters)   
Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse) ' can change first parameter to other avaialabe formats : ppPasteGIF, ppPasteEnhancedMetafile, ppPasteOLEObject, etc.

' set different parameters for the pasted chart in PowerPoint slide
With myChart
    .Left = 200
    .Top = 200
End With

End Sub
在代码行中:

Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse)

您可以将括号中的第一个参数:ppPasteBitmap更改为许多其他可用的格式(测试它们并查看哪种格式的效果最好),例如:ppPasteGIFppPasteEnhancedMetafileppPasteOLEObject,等等。

我喜欢使用另一种方法,我想定义一个
对象
,然后将其设置为粘贴的图表。之后,在PowerPoint(从Excel)中修改粘贴的图表对象的参数就容易多了

见下面的代码:

Sub copyChart(curSlide As Slide)

Dim chr             As ChartObject
Dim myChart         As Object

Set chr = Sheets("CHARTSHEET").ChartObjects(1)
chr.Copy

' setting myChart object to the pasted chart (let's me later an easy way to modify it's parameters)   
Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse) ' can change first parameter to other avaialabe formats : ppPasteGIF, ppPasteEnhancedMetafile, ppPasteOLEObject, etc.

' set different parameters for the pasted chart in PowerPoint slide
With myChart
    .Left = 200
    .Top = 200
End With

End Sub
在代码行中:

Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse)

您可以将括号中的第一个参数:ppPasteBitmap更改为许多其他可用的格式(测试它们并查看哪种格式的效果最好),例如:ppPasteGIFppPasteEnhancedMetafileppPasteOLEObject,等等。

我在最新版本的Office中遇到了很多麻烦。2003年和更早的时候没有这个问题,2007年和2010年有一点,2013年和2016年有一点

当您单步执行代码时,它工作正常,但当您全速运行它时,它会在粘贴时出错

这就好像拷贝没有时间完成一样,所以当你粘贴剪贴板时,它没有任何东西要粘贴

有时这有助于:

chrt.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
DoEvents
curSlide.Shapes.Paste

DoEvents
告诉VBA在后台操作有机会完成时等待。

在最新版本的Office中,我遇到了很多麻烦。2003年和更早的时候没有这个问题,2007年和2010年有一点,2013年和2016年有一点

当您单步执行代码时,它工作正常,但当您全速运行它时,它会在粘贴时出错

这就好像拷贝没有时间完成一样,所以当你粘贴剪贴板时,它没有任何东西要粘贴

有时这有助于:

chrt.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
DoEvents
curSlide.Shapes.Paste

DoEvents
告诉VBA等待后台操作有机会完成。

请参阅下面的我的答案请参阅下面的我的答案