2016-01-21 71 views
1

我在VBA中创建了一个代码,用于将图形从Excel中复制到现有的PowerPoint文件,这些图形被添加到现有幻灯片中。在Excel中,我有一张表格,指出哪张幻灯片和每个形状的位置(我命名所有形状,以便我可以通过名称引用它们)。我的代码循环遍历这个表格以获得形状并将其粘贴到指定的幻灯片中。这是我的代码:将Excel中的图形粘贴/复制到PowerPoint中的错误VBA

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 = "" 

末次

当我第一次尝试,它做工精细。我创建了一个示例PPT,一切都很顺利。 一旦我改变了使用官方PPT(重量大约为120MB)的路径,它显示以下错误: View.PasteSpecial:无效的请求。剪贴板为空或包含可能未粘贴的数据。

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

回答

1

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

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

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

在你的情况下,更好的解决方案是声明一个Shape变量,为它分配你正在复制的形状,然后将它添加到你的目标幻灯片中。这应该起作用,因为形状(保存为Shape变量)无法添加到新幻灯片,直到变量赋值完成。当然,ASSUMING认为VBA有一种方法可以将形状添加到幻灯片中...