2016-08-16 3 views
1

Я пытаюсь вызвать нижеприведенный Sub, чтобы скопировать данный график в указанную презентацию PowerPoint. Однако, когда я запускаю макрос, который вызывает этот Sub, строка, указанная ниже, возвращает следующую ошибку: «Объект не поддерживает это свойство или метод». Что странно, так это то, что оба Shapes и Slide содержат методы, которые вызывают. Кроме того, битмап правильно скопирован в мой буфер обмена и вставляется в слайд перед вызовом ошибки. Вы найдете Sub() ниже.Ошибка в скрипте, который копирует диаграммы из Excel в PowerPoint

Sub copyChart(chrt As Chart, pres As PowerPoint.Presentation) 
    Dim curSlide As Slide, dummySlide As Slide 
    Set dummySlide= pres.Slides(2) 'Second slide is dummy slide. 
    Set curSlide = dummySlide.Duplicate(1) 'Duplicate dummy, set as current slide. 
    chrt.CopyPicture Appearance:=xlScreen, Format:=xlBitmap 'Copy the chart as a picture. 
    curSlide.Shapes.Paste '<-----------Error here. 
End Sub 

Как хорошо, я надеялся обеспечить .txt файл всего моего сценария, но не был уверен, как (это немного длинны, чтобы вставить здесь). Спасибо за вашу помощь.

(Обратите внимание, что эта реализация очень похожа на Paste Excel Chart into Powerpoint using VBA, далее путает меня.)

+0

см. Мой ответ ниже –

ответ

1

У меня было много проблем в последних версиях Office. 2003 и раньше не было этой проблемы, в 2007 и 2010 годах это было немного, а 2013 и 2016 годы - в пиках.

Когда вы проходите через код, он отлично работает, но когда вы запускаете его на полной скорости, это ошибки на пасте.

Это как если бы копия не успела закончить финиш, поэтому, когда вы вставляете буфер обмена, в нем еще ничего нет, чтобы вставить.

Иногда это помогает:

chrt.CopyPicture Appearance:=xlScreen, Format:=xlBitmap 
DoEvents 
curSlide.Shapes.Paste 

DoEvents говорит VBA ждать, пока фоновые операции имеют шанс закончить.

2

Похоже, что ошибка может быть связан с тем, как VBA обрабатывает переменные через различные ссылки. (В частности, как PPT VBA справляется с ними.) Я смог заставить макрос работать, активно выбирая/копируя диаграммы. Мне нужно будет сделать немного больше исследований, чтобы понять, почему переменные вызывают проблемы, но, по крайней мере, я знаю, как решить эту проблему.

Sub copyChart(curSlide As Slide) 
    Dim chr as ChartObject 
    Set chr = Sheets("CHARTSHEET").ChartObjects(1) 
    Sheets("CHARTSHEET").Select 
    ActiveChart.CopyPicture 
    curSlide.Shapes.PasteSpecial 
End Sub 
1

Я хотел бы использовать другой метод, я хотел бы определить Object, а затем установить его на вставленной диаграммы. Впоследствии гораздо проще изменить параметры вставного объекта диаграммы внутри PowerPoint (из Excel).

См код ниже:

Sub copyChart(curSlide As Slide) 

Dim chr    As ChartObject 
Dim myChart   As Object 

Set chr = Sheets("CHARTSHEET").ChartObjects(1) 
chr.Copy 

' setting myChart object to the pasted chart (let's me later an easy way to modify it's parameters) 
Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse) ' can change first parameter to other avaialabe formats : ppPasteGIF, ppPasteEnhancedMetafile, ppPasteOLEObject, etc. 

' set different parameters for the pasted chart in PowerPoint slide 
With myChart 
    .Left = 200 
    .Top = 200 
End With 

End Sub 

В строке кода:

Set myChart = curSlide.Shapes.PasteSpecial(ppPasteBitmap, msoFalse) 

Вы можете изменить первый параметр в скобках: ppPasteBitmap для многих других avaialble форматах (проверить их и см., какой из них дает наилучший результат), например: ppPasteGIF, ppPasteEnhancedMetafile, ppPasteOLEObject и т.д.