Завершение транзакции отмены в макросе в PowerPoint - PullRequest
3 голосов
/ 22 ноября 2011

Как описано в http://support.microsoft.com/kb/278591 PowerPoint обычно объединяет все изменения, которые вносит макрос или надстройка в один шаг отмены. Так что если вы поместите следующий код в VBA и выполните его дважды, нажав F5 там будет только один шаг отмены.

Sub Move()
    If ActiveWindow.Selection.Type = ppSelectionShapes Then
        ActiveWindow.Selection.ShapeRange.IncrementLeft 10
    End If
End Sub

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

Я обнаружил, что ExecuteMso, похоже, прерывает транзакцию отмены. Поэтому, если вы выполните следующий код дважды, это приведет к 4 шагам отмены (первый шаг, ExecuteMso, второй шаг, ExecuteMso).

Sub Move()
    If ActiveWindow.Selection.Type = ppSelectionShapes Then
        ActiveWindow.Selection.ShapeRange.IncrementLeft 10
        Application.CommandBars.ExecuteMso "Bold"
    End If
End Sub

Кто-нибудь знает реальное решение проблемы или лучший обходной путь? Хотя я не нашел его, может быть, есть решение для Word или Excel, которое можно перенести в PowerPoint?

1 Ответ

4 голосов
/ 23 ноября 2011

Если вы замените строку ExecuteMso на эту, вся процедура останется одна Отмена:

ActiveWindow.Selection.ShapeRange.TextEffect.FontBold = msoTrue

Обновление

Если вы используете PowerPoint 2010или позже поместите эту строку перед каждым блоком кода, который вы хотите, чтобы пользователь мог отменить шаг за раз:

Application.StartNewUndoEntry
...