Я пытаюсь скопировать некоторые диаграммы (встроенные) в разные листы книги Excel, используя vbscript, на разные слайды PowerPoint. При этом я хотел бы сохранить связь между таблицей Excel и powerpoint, и поэтому я использовал приведенный ниже фрагмент кода, который позволяет мне сохранять форматирование и ссылки (вместо простой вставки или PasteSpeical. Есть ли другой способ?) :
For i = 1 to TotalNumWorkSheets 'I iterated with indices.
Set pptSlide = pptPres.Slides.Add(i, 11) 'There is one opening slide before this.
set ws = wb.Worksheets(i)
ws.ChartObjects(1).Chart.ChartArea.Copy
pptApp.CommandBars.ExecuteMso("PasteExcelChartSourceFormatting")
pptApp.CommandBars.ReleaseFocus
With pptSlide
.Shapes.Title.TextFrame.TextRange.Text = objCurSheet.Name
'Adding some more textboxes here. Working fine. Position checks out in PPT.
.Shapes(.Shapes.Count).Left = 20 'Doesn't work for all slides.
End With
Next
Код работает и копирует все диаграммы, создает заголовки, добавляет новый текст, как и ожидалось, но я не могу расположить диаграммы на отдельных слайдах, потому что после команды ExecuteMso я не знаю, как получить доступ к ссылке на график. В одном из сообщений SO я прочитал, что вставка с использованием этого метода приводит к потере выбора диаграммы, но вы можете получить доступ к последнему объекту .Shapes, так как вставка всегда добавляет объект в конец списка. Это всегда так? Я попытался получить доступ и позиционировать свою диаграмму путем доступа к последнему объекту, но он работает только для первого слайда цикла (т.е. первая вставленная диаграмма смещена влево = 20). Остальные все графики на других слайдах центрированы. Может кто-нибудь объяснить, где и как добавить параметры диаграммы форматирования? Я столкнулся с еще более странной проблемой. Если я увеличу количество листов, даже первый график потеряет свое левое форматирование. Приведенный выше код - единственное место, где я добавляю форматирование, поэтому я не знаю, что происходит. Я уверен, что не правильно его форматирую.
Большое спасибо за ваши предложения.
Edit: еще одна вещь, которую я протестировал. я использую
WScript.Sleep 500
код перед завершением цикла For, поскольку он дает достаточно времени для завершения предыдущих операций (по крайней мере, это я понял из многих других поисков в Google).