2016-01-21 75 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有一種方法可以將形狀添加到幻燈片中...