[有时,您需要在Excel中复制图表,然后使用VBA将其粘贴到PowerPoint演示文稿中。当您要自动执行报告时,这很方便。
问题:假设您没有将图形转换为图像,并且根据要粘贴的图形的大小和复杂性,在VBA尝试继续操作之前,没有时间粘贴图形。程序。当您想要在粘贴图形后对其进行操作(例如将其放置在幻灯片上)时,这很烦人。有效发生的事情是您最终试图在幻灯片上移动图表...尚未作为PowerPoint形状“存在”。
这个问题很烦人,但我的愚见实际上是一个错误。除了John Peltier的answer的潜在例外,我还没有看到针对SO问题的可靠解决方案。他的答案很可能是正确的(并且已在线程上被指定为此类),但不幸的是,我无法在我的实现中使用它。
我在下面列出的问题。
代码(为便于参考,对其进行了简化):
Public Sub X2P()
'Copy chart and paste
ActiveChart.ChartArea.Copy
Set mySlide = myPresentation.Slides(2)
PasteChartIntoSlide mySlide
End Sub
Function PasteChartIntoSlide(theSlide As Object) As Object
CreateObject("PowerPoint.Application").CommandBars.ExecuteMso ("PasteSourceFormatting")
End Function
我看到其他人试图分解脚本并使用单独的功能复制,粘贴和定位图表。这比较干净,但对我不起作用。
我发现的解决方案是在代码粘贴图表num_obj
之前计算幻灯片上的形状数量,并将变量num_obj_final
设置为num_obj + 1
(即,一旦图表粘贴)。然后,我在粘贴事件之后创建一个循环,在该循环中,每次迭代都会重新计算num_obj
。仅当num_obj
等于num_obj_final
时,过程才退出循环。然后脚本可以按预期的方式恢复,因为您可以确定形状现在“存在”在幻灯片上。
PasteChartIntoSlide()函数的最终代码:
Function PasteChartIntoSlide(theSlide As Object) As Object
theSlide.Select
num_obj = 0
num_obj_final = theSlide.Shapes.Count + 1
CreateObject("PowerPoint.Application").CommandBars.ExecuteMso ("PasteSourceFormatting")
DoEvents
Do Until num_obj = num_obj_final
num_obj = theSlide.Shapes.Count
'Debug.Print num_obj
Loop
End Function