1

Тема: Как узнать были ли изменения в документе пользователем

Как узнать были ли изменения в документе пользователем
Думал сделать так

Documents(ActiveDocument).Undo 1 'отмена действий, в количестве ... шт.
И если пользователь ничего не делал выдаст ошибку №
И тогда мне нужно так:
If ошибка № ... Then Dialogs(wdDialogFileSaveAs).Execute
Но ведь можно же как то после этой строки: Documents(ActiveDocument).Undo 1 отследить
изменились ли что? как?
Как узнать сколько реально возможно в документе сделать Ундо раз??

2

Re: Как узнать были ли изменения в документе пользователем

Говорить, что Undo работает с изменениями документа, не совсем точно. Undo - отмена последнего действия (нескольких действий) содержащегося в Undo-буфере.

Результат Undo проверяется и без On Error:
If ActiveDocument.Undo = False Then MsgBox "Буфер отмены пуст!"

Также можно проверить параметр ActiveDocument.Saved.

Количество элементов в буфере считываем их элементов интерфейса MS Word, т.е. из кнопок "Отменить" и "Вернуть". Это работает во всех версиях MS Word:

Sub A()

Dim U&, R&
    
    If Doc_UndoRedoCount(U, R) Then
        MsgBox "Количество элементов в Undo/Redo буфере активного документа: " & vbLf & _
               "отмена (undo):   " & CStr(U) & vbLf & _
               "вернуть (redo):  " & CStr(R)
    Else
        MsgBox "Нет открытых документов!"
    End If
    
End Sub

Public Function Doc_UndoRedoCount( _
    Optional ByRef UndoCount As Long, _
    Optional ByRef RedoCount As Long) As Boolean
' подсчет количества элементов в Undo и Redo буферах (-1 при ошибке)
' возвращает True, пи успехе

    Doc_UndoRedoCount = False
    On Error Resume Next
    UndoCount = -1
    RedoCount = -1
    If ActiveDocument Is Nothing Then Exit Function
    Doc_UndoRedoCount = True
    ' список "Отмена"
Const c_ID_Undo& = 128 ' Id списка "Отмена"
Dim undoBtn As CommandBarComboBox

    Set undoBtn = Application.CommandBars.FindControl(Id:=c_ID_Undo)
    If undoBtn Is Nothing Then
    Else
        UndoCount = 0
        UndoCount = undoBtn.ListCount
    End If
    ' список "Вернуть"
Const c_ID_Redo& = 129 ' Id списка "Вернуть"
Dim redoBtn As CommandBarComboBox

    Set redoBtn = Application.CommandBars.FindControl(Id:=c_ID_Redo)
    If redoBtn Is Nothing Then
    Else
        RedoCount = 0
        RedoCount = redoBtn.ListCount
    End If
           
End Function

Отредактировано Вождь (25.07.2010 04:38:08)

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Как узнать были ли изменения в документе пользователем

Вождь пишет:

Буфер отмены пуст

Я Вам очень благодарен, всего лишь одна строка кода и здравый смысл восторжествовал:
Sub AutoClose()
'AutoClose работает при закрытии документа Ворд

'условие, если буфер отмены пуст, тогда ...
'закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

End Sub

Остался только один нюанс, который даже если и не решится можно и обойтись, а именно:
теперь ведь в документе, когда я редактирую код ВБА, документ закрывается без вопросов
И ведь по идее всё верно, Ундо пустое нет вопросов к ВБА.
Но уж для полного счастья как условие ещё поставить если изменялся код ВБА, тогда также спросить о сохранении документа???
А так всё равно спасибо большое.

4

Re: Как узнать были ли изменения в документе пользователем

Ципихович Эндрю пишет:

...
' условие, если буфер отмены пуст, тогда ...
If ActiveDocument.Undo = False Then
...

ActiveDocument.Undo - это не параметр, а команда идентичная ActiveDocument.Undo(1), т.е. учитывайте что она выполняет одну отмену. Лучше (и для изменений кода) писать так:
If ActiveDocument.Saved = False Then

Макросы под заказ и готовый пакет - mtdmacro.ru