Обработчики событий в Word VBA — MailMergeRecordMerge

Я понимаю, что VBA в Word имеет ряд обработчиков событий, которые запускают события, когда в документе происходят определенные события, но я не могу заставить хоть один из них работать вообще.

Мне нужно обновить поле в каждой записи слияния, но я не могу запустить его.

Вот что у меня есть на данный момент:

Private Sub Document_MailMergeRecordMerge()
    ActiveDocument.Variables("SuperV").Value = ActiveDocument.MailMerge.DataSource.DataFields("Supervisor").Value
End Sub

Может ли кто-нибудь сказать мне, а) куда это нужно идти и б) что может потребоваться, чтобы он действительно работал?

Если я запускаю подпрограмму вручную, она работает, как и ожидалось, в активной записи MailMerge.


person bbk    schedule 28.05.2014    source источник
comment
Просто написал целый ответ за полчаса и понял, что есть способ проще. Обновление сейчас.   -  person hammus    schedule 28.05.2014


Ответы (2)


Неудивительно, что у тебя с этим проблемы. Чтобы получить доступ к нужному вам событию (событию MailMergeBeforeRecordMerge), вам нужен доступ к объекту приложения.

Это относительно легко сделать:

'declare global Application reference
Dim WithEvents wdApp As Application

'установить ссылку где-нибудь (я использовал Document_Open, но вы можете использовать все, что хотите)

Private Sub Document_Open()

    'Get a reference to the Word application to handle mail merge events.
    Set wdApp = Application
End Sub

Private Sub wdApp_MailMergeBeforeRecordMerge(ByVal doc As Document)
    Debug.Print ("MailMergeBeforeRecordMerge")

End Sub

'clean up
Private Sub Document_Close()
    wdApp = Nothing
End Sub

Несколько хороших примеров можно найти в старых документах MS Word 2002 (в 2013 году они все еще Word): Word 2002 MailMerge демонстрация кода события

person hammus    schedule 28.05.2014
comment
Хм, я пробовал это, и хотя он не выдает никаких ошибок отладки, на самом деле, похоже, не выполняется код в подразделе wdApp_MailMergeBeforeRecordMerge(). Я вставил туда msgbox(Run!), чтобы увидеть, запускает ли он вообще подпрограмму, и, похоже, она вообще не запускается - хотя я не уверен, почему. - person bbk; 28.05.2014
comment
@bbk ты продвинулся дальше? мне тоже не повезло - person basher; 24.02.2016

Полный рабочий пример обновлен для Word 2016

'declare global Application reference
Dim WithEvents wdApp As Application
Private Sub Document_Open()
    Debug.Print ("Document_Open")
    'Get a reference to the Word application to handle mail merge events.
    Set wdApp = Application
End Sub

Private Sub wdapp_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
    Debug.Print ("MailMergeBeforeRecordMerge")

End Sub

Private Sub Document_Close()
    Debug.Print ("Document_Close")
    wdApp = Nothing
End Sub
person Ian Gates    schedule 14.01.2016
comment
Пожалуйста, уточните, что вы изменили в ответе leemo и почему вы это изменили. - person Simon MᶜKenzie; 14.01.2016