Часто VBA начинает работать с объектами, когда эти объекты еще не готовы к работе. Даже копирование объекта может быть не завершено (т. Е. Весь объект не полностью передан в буфер обмена), когда VBA пытается вставить.
Я обнаружил, что помещения определенных операций в отдельную процедуру может быть достаточно, чтобы заставить VBA ждать завершения одного фонового процесса, прежде чем запустить следующий.
Например, в приведенном ниже коде я переместил вставку из основной процедуры. Это заставляет VBA подождать, пока копия не будет сделана, перед вставкой, а также, пока не будет выполнена вставка, прежде чем позиционировать вставленную диаграмму.
На самом деле у меня часто есть три отдельные функции, которые вызываются основной подпрограммой: копирование диаграммы, вставка диаграммы и позиционирование диаграммы.
Public Sub CopyPasteHeadcountTopGraph()
If PPT Is Nothing Then Exit Sub
If PPT_pres Is Nothing Then Exit Sub
Dim rng As Range
Dim mySlide As Object
Dim myShape As Object
Dim cht As Chart
Set mySlide = PPT_pres.Slides(6)
With mySlide
.Select
Set cht = ThisWorkbook.Worksheets("Headcount").ChartObjects("HcChart").Chart
cht.CopyPicture Appearance:=xlScreen, Format:=xlPicture, Size:=xlScreen
'''''''''''''''''''''''''''''''''''
'' .Shapes.Paste.Select 'ERROR HERE
'''''''''''''''''''''''''''''''''''
PasteChartIntoSlide mySlide
PPT_pres.Windows(1).Selection.ShapeRange.Left = 35
PPT_pres.Windows(1).Selection.ShapeRange.Top = 110
PPT_pres.Windows(1).Selection.ShapeRange.Width = 655
PPT_pres.Windows(1).Selection.ShapeRange.Height = 300
End With
'Clear The Clipboard
Application.CutCopyMode = False
Application.Wait (Now + TimeValue("00:00:01"))
End Sub
Function PasteChartIntoSlide(theSlide As Object) As Object
theSlide.Shapes.Paste.Select
End Function