Процедура продолжается до того, как диаграмма была вставлена ​​из Excel в Powerpoint - PullRequest
0 голосов
/ 08 февраля 2020

Иногда вам нужно скопировать диаграмму в Excel и вставить ее в презентацию PowerPoint с помощью VBA. Это удобно, когда вы хотите автоматизировать отчет.

Проблема: при условии, что вы не конвертируете график в изображение, и в зависимости от размера и сложности графика, который вы пытаетесь вставить, график не успевает вставить до VBA пытается продолжить процедуру. Это раздражает, когда вы хотите манипулировать графиком после его вставки (например, расположив его на слайде). Что в действительности происходит, так это то, что вы пытаетесь переместить диаграмму на слайде ... которая еще не «существует» в виде формы PowerPoint.

Эта проблема раздражает и, по моему скромному мнению, на самом деле представляет собой ошибку. Я еще не видел надежного решения проблемы SO, за возможным исключением этого ответа от Джона Пельтье. Его ответ, скорее всего, правильный (и был обозначен как таковой в потоке), но, к сожалению, я не смог заставить это работать в моей реализации.

Проблема, которую я изложил ниже.

Код (упрощенный для удобства пользования):

   Public Sub X2P()           
       'Copy chart and paste
        ActiveChart.ChartArea.Copy
        Set mySlide = myPresentation.Slides(2)    
        PasteChartIntoSlide mySlide    
    End Sub

    Function PasteChartIntoSlide(theSlide As Object) As Object    
        CreateObject("PowerPoint.Application").CommandBars.ExecuteMso ("PasteSourceFormatting")            
    End Function

1 Ответ

1 голос
/ 08 февраля 2020

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

Решение, которое я нашел, состоит в том, чтобы подсчитать количество фигур на слайде до того, как код вставит диаграмму, num_obj, и установить переменную * 1004. * as num_obj + 1 (т.е. общее количество фигур после вставки диаграммы). Затем я создаю al oop после события вставки, где я пересчитываю num_obj с каждой итерацией. Только когда num_obj равно num_obj_final, процедура завершает l oop. И затем сценарий может возобновиться, как и ожидалось, поскольку вы можете быть уверены, что фигура теперь «существует» на слайде.

Окончательный код для функции PasteChartIntoSlide ():

Function PasteChartIntoSlide(theSlide As Object) As Object
    theSlide.Select

    num_obj = 0
    num_obj_final = theSlide.Shapes.Count + 1
    CreateObject("PowerPoint.Application").CommandBars.ExecuteMso ("PasteSourceFormatting")

    DoEvents

    Do Until num_obj = num_obj_final
    num_obj = theSlide.Shapes.Count
    'Debug.Print num_obj
    Loop

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...