События могут вызываться только из класса, поэтому к макросу нужно создать класс.
В общем здесь можно поступить двояко: можно прявязаться к событию приложения, а можно привязаться к событию конкретного документа
Через события приложения. Макрос:
Sub ApplicationSaveRun()
Dim SaveEvent As ApplicationSave
Set SaveEvent = New ApplicationSave
Dim flag As Boolean: flag = True
Do While flag
DoEvents
Loop
End Sub
Теперь создайте класс с именем ApplicationSave и вставьте туда следующий код:
Private WithEvents e_onsave As ApplicationEvents
Private Sub Class_Initialize()
Set e_onsave = ThisApplication.ApplicationEvents
End Sub
Private Sub e_onsave_OnSaveDocument(ByVal DocumentObject As Document, ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
If BeforeOrAfter = kBefore Then MsgBox "Before Save"
If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
End Sub
**********************************************
теперь вариант через привязку к событию самого документа
Sub DocumentSaveRun()
Dim SaveEvent As DocumentSave
Set SaveEvent = New DocumentSave
Call SaveEvent.SetDocument(ThisApplication.ActiveDocument)
Dim flag As Boolean: flag = True
Do While flag
DoEvents
Loop
End Sub
Теперь создайте класс с именем DocumentSave и вставьте туда следующий код:
Private WithEvents e_doc_save As DocumentEvents
Public Sub SetDocument(ByVal doc As Document)
Set e_doc_save = doc.DocumentEvents
End Sub
Private Sub e_doc_save_OnSave(ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
If BeforeOrAfter = kBefore Then MsgBox "Before Save"
If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
End Sub
P.S. Только не пойму, почему то функция DoEvents ресурсы жрет одного процессора, видимо потому что VBA сам по себе корявый.