错误代码粘贴/复制形状从Excel到PowerPoint VBA

我在VBA中创build了一个代码,用于将Excel中的graphics复制到现有的PowerPoint文件中,并将这些graphics添加到现有的幻灯片中。 在Excel中,我有一个表,指出哪个幻灯片,并在哪个位置,以每个形状(我命名所有的形状,以便我可以引用他们的名字)。 我的代码通过这个表循环来获取形状并粘贴到指定的幻灯片。 这是我的代码:

Dim nombrePic As String, auxi As String, i As Integer Dim PPT As Object Dim PPSlide As PowerPoint.Slide Dim numSlide As Integer, posVertical As Double, posHorizontal As Double 'Abrir PPT Set PPT = CreateObject("PowerPoint.Application") PPT.Visible = True PPT.Presentations.Open "c:\prueba.pptx" auxi = Sheets("FigurasResumen_RangPD").Cells(2, 5) i = 2 Do Sheets("FigurasResumen_RangPD").Shapes(auxi).Copy 'Get paste information about shape numSlide = Sheets("FigurasResumen_RangPD").Cells(i, 8) posHorizontal = Sheets("FigurasResumen_RangPD").Cells(i, 9) posVertical = Sheets("FigurasResumen_RangPD").Cells(i, 10) PPT.ActiveWindow.View.GotoSlide (numSlide) PPT.ActiveWindow.View.PasteSpecial DataType:=ppPasteDefault PPT.ActiveWindow.Selection.ShapeRange.Left = Format(Application.CentimetersToPoints(posHorizontal), "0.00") PPT.ActiveWindow.Selection.ShapeRange.Top = Format(Application.CentimetersToPoints(posVertical), "0.00") PPT.ActiveWindow.Selection.ShapeRange.ZOrder msoSendToBack i = i + 1 auxi = Sheets("FigurasResumen_RangPD").Cells(i, 5) Loop Until auxi = "" 

结束小组

当我第一次尝试它时,它工作正常。 我创build了一个示例PPT,一切都很顺利。 一旦我改变了使用官方PPT(重约120MB)的path,它显示以下错误:View.PasteSpecial:无效请求。 剪贴板是空的或包含可能不会粘贴在这里的数据。

任何想法为什么发生这种情况

[replace的答案:我昨天写了一个答案,但我认为这个更好。]

VBA将“复制”和“粘贴”操作视为彼此无关。 它也是asynchronous执行的 – 它开始执行一条指令,然后它可能会继续执行下一条指令,而前一条指令仍在执行中。 如果第二条指令依赖于第一条指令,它不应该这样做,但“粘贴”只是从剪贴板中取出任何东西,它不知道剪贴板上的内容。 具体来说,它并没有特别涉及到之前的“复制”命令。 然后,复制到剪贴板是一个缓慢的过程; 在剪贴板上的任何内容(或者只有部分不完整的数据)之前,程序执行得到“粘贴”。

有两种方法可以解决这个问题。 一个是在paste命令之前添加一个Sleep xxx指令。 xxx是毫秒数 – 为了使睡眠正常工作,您需要在模块顶部正确声明它(这是一个Windows函数,而不是VBA函数)。 谷歌“VBA睡眠function”或类似的东西。 有了这个解决scheme,你必须用xxx进行试验,有时候2ms就足够了,有时50ms是不够的。 不是一个好的解决scheme

在你的情况下更好的解决scheme将是声明一个形状variables,分配给它复制的形状,然后将其添加到您的目标幻灯片。 这应该工作,因为形状(保存为Shapevariables)不能添加到新的幻灯片,直到variables分配完成。 假设,当然,VBA有一个方法来为幻灯片添加一个形状…