Запустить макрос MS Word после сохранения события

В шаблоне MS Word 2007 есть нижний колонтитул с именем файла. Пользователь собирается открыть шаблон и сделать "Сохранить как...", чтобы сделать свой документ.

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

Есть AfterSaveEvent или что-то, что я могу использовать в качестве ловушки для запуска моего VBA-скрипта, который выполняет обновление?

Или есть намного более простой способ?

3 ответа

Решение

Просто создайте макрос наподобие этого (я считаю, что он работает лучше, если включен в Normal.dot)

Sub FileSaveAs()
'
' FileSaveAs Macro
' Saves a copy of the document in a separate file
'
Dialogs(wdDialogFileSaveAs).Show

'returns the name including the .doc extension 
 ChosenFileNameAndExtension = ActiveDocument.Name 'Or use .FullName

' Your code here

End Sub

Он будет срабатывать всякий раз, когда пользователь выбирает "Файл Сохранить как"

НТН!

Мы знаем, что Aftersave событие недоступно для Microsoft Word. Но Word позволяет нам использовать BeforeSave событие. Я реализовал это решение, и оно отлично работает.

Сначала мы должны реализовать Application.onTime метод в Word BeforeSave событие следующим образом

Private Sub mobjWord_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)
    Word.Application.OnTime Now + TimeValue("00:00:02"), "AfterSave"
End Sub

Этот метод вызовет метод с именем AfterSave через 2 секунды.

Public Sub AfterSave()
   While Word.ActiveDocument.Application.BackgroundSavingStatus <> 0
      DoEvents
   Wend
'Implement your code here
End Sub

В этом методе цикл while будет распространяться до тех пор, пока процесс сохранения документа не будет завершен. Таким образом, вы можете реализовать свой код после цикла while.

Это сработало на основании ответа @belisarius:

Sub UpdateAll()
    Dim oStory As Object
    Dim oToc As Object

    'Exit if no document is open
    If Documents.Count = 0 Then Exit Sub
    Application.ScreenUpdating = False

    For Each oStory In ActiveDocument.StoryRanges
        oStory.Fields.Update 'Update fields in all stories
    Next oStory

    For Each oToc In ActiveDocument.TablesOfContents
        oToc.Update 'Update table of contents
    Next oToc

    Application.ScreenUpdating = True
End Sub

Sub FileSaveAs()
'
' FileSaveAs Macro
' Saves a copy of the document in a separate file
'
Dialogs(wdDialogFileSaveAs).Show

UpdateAll


End Sub
Другие вопросы по тегам