Powerpoint VBA Undo - PullRequest
       5

Powerpoint VBA Undo

3 голосов
/ 09 марта 2020

У меня есть код VBA, который обрабатывает много слайдов в файле PowerPoint. Часть кода временно изменяет размеры слайдов, поэтому я могу экспортировать изображения с другим соотношением сторон.

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

Application.StartNewUndoEntry

до того, как я выполню изменение размера, а затем

Application.CommandBars.ExecuteMso "Undo"

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

Затем я записываю некоторые метаданные на страницу примечаний к слайдам и повторяю для следующего слайда.

Проблема в том, что

Application.CommandBars.ExecuteMso "Undo"

не блокируется до завершения отмены , Это означает, что запись на страницу заметок (после которой Application.CommandBars.ExecuteMso "Undo") также отменяется!

Как заставить PowerPoint ждать, пока она не завершится Application.CommandBars.ExecuteMso "Undo", прежде чем выполнять код, который записывает в заметки page?

Я пытался перевести паузу в ожидании и даже на пару секунд между отменой и другим моим кодом, но, похоже, это совсем не помогает. Он все еще отменяет код, который я выполняю ПОСЛЕ вызова executeMso "Undo"

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

(Я также попытался переместить код обновления заметок до изменения размера (и затем отменить) слайда - но это не работает, потому что он просто перемещает проблему на предыдущий слайд, который не завершен, а не на текущий.)

1 Ответ

0 голосов
/ 09 марта 2020

Создан обходной путь, который работает, дожидаясь, пока размер слайда вернется к тому, что был до того, как произошло изменение размера.

i = 0
Do While ActivePresentation.PageSetup.SlideWidth <> dOldSlideWidth And i <= 100
    i = i + 1
    Sleep 100
    DoEvents
Loop
If i >= 100 Then MsgBox "Gave up after waiting 100 times for the slidewidth to revert after Undo"
oSi.sQHash = SlideInfoCreateQHASH(oSi)
SlideInfoWrite oSl, oSi

Иногда он ждет 1 или 2 раза, прежде чем обнаружит, что отмена произошла. В других случаях он ожидает до 40 итераций (4 секунды). Как только он остановился после 100 итераций (10 секунд).

Ну, это не красиво, но работает !!!

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