我在VBA中创建了一个代码,用于将Excel中的工作表中的形状复制到现有的PowerPoint文件中,这些形状将添加到现有幻灯片中。在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 = ""
End Sub
当我第一次尝试时,它工作正常。我创建了一个示例PPT,一切都很顺利。 一旦我改变了使用官方PPT(权重大约120MB)的路径,它就会显示以下错误: View.PasteSpecial:无效的请求。剪贴板为空或包含可能未在此处粘贴的数据。
为什么会发生这种情况?
答案 0 :(得分:1)
[答案替换:昨天我写了一个答案,但我认为这个更好。]
VBA看到"复制"并且"粘贴"彼此无关的运作。它也异步执行 - 它开始执行一条指令,然后它可以在前一条指令仍在执行时继续执行下一条指令。如果第二条指令取决于第一条指令,那么它就不应该这样做,但是"粘贴"从剪贴板中取出任何东西,它都不知道剪贴板上的东西是怎么回事。特别是,它并没有特别涉及" copy"命令就在它之前。然后,复制到剪贴板是一个缓慢的过程;程序执行进入"粘贴"在剪贴板上有任何东西之前(或者只有部分不完整的数据在上面)。
有两种方法可以解决这个问题。一种是在粘贴命令之前添加Sleep xxx
指令。 xxx是一个毫秒 - 并且要使Sleep工作,您需要在模块的顶部正确声明它(它是Windows函数,而不是VBA函数)。 Google" VBA睡眠功能"或类似的东西。使用此解决方案,您必须尝试使用xxx,有时2 ms就足够了,有时50 ms就不够了。不是一个好的解决方案。
在您的情况下,更好的解决方案是声明一个Shape变量,为其分配您正在复制的形状,然后将其添加到目标幻灯片中。这应该有效,因为在变量赋值完成之前,无法将形状(保存为Shape变量)添加到新幻灯片中。当然,假设VBA有一种向幻灯片添加形状的方法......