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

Однако, когда я открываю письма с помощью «OLEObject.Activate», я сталкиваюсь с двумя проблемами:

  1. В документе систематически отображается предупреждение о слиянии писем.
  2. Указанное предупреждение систематически помещается в фоновый режим, заставляя вас нажимать «Alt + Tab», чтобы найти его.

Я пробовал два способа открыть документ:

Dim WDApp As Word.Application
Dim WDDoc As Word.Document

WDObject.Activate

Set WDApp = GetObject(, "Word.Application")
WDAPP.Visible = True
WDApp.DisplayAlerts = wdAlertsNone
Set WDDoc = WDApp.ActiveDocument

А также :

Dim WDApp,WDOpen As Word.Application
Dim WDDoc As Word.Document

'for some reason if I try to create the application directly with WDApp it then won't be able to recognize the active document so I have to open word using a proxy
Set WDOpen = CreateObject("Word.Application")
WDOpen.Visible = True
WDOpen.DisplayAlerts = wdAlertsNone

Set WDApp = GetObject(, "Word.Application")

WDObject.Activate

Set WDDoc = WDApp.ActiveDocument
0
Neokyr 11 Июн 2021 в 11:12

2 ответа

Лучший ответ

Простой ответ - не встраивать основные документы mailmerge в свою книгу. Перед встраиванием сохраните их вне Excel как обычные документы. Это также означает, что ваш код VBA должен включать соответствующий код запроса SQL.

0
macropod 11 Июн 2021 в 13:28

Итак, я последовал рекомендациям макроподов и вот конечный результат:

Private Sub Publipost(WDObject As OLEObject, filter As String)
    Dim WDApp As Word.Application
    Dim WDDoc As Word.Document
    Dim excelFileName, connection As String
            
    excelFileName = Application.ThisWorkbook.Path & "\" & Application.ThisWorkbook.Name
    connection = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=""" & excelFileName & """;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine T"
          
    WDObject.Activate        
    Set WDApp = GetObject(, "Word.Application")    
    Set WDDoc = WDApp.ActiveDocument

    With WDDoc.MailMerge
        .OpenDataSource Name:=excelFileName, _
         ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
         AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
         WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
         Format:=wdOpenFormatAuto, connection:=connection, _
         SQLStatement:="SELECT * FROM `Publipostage$`  where TYPEETAB = '" & filter & "' ", _
         SubType:=wdMergeSubTypeAccess
        .Destination = wdSendToNewDocument
        .Execute
     End With

     WDDoc.Close SaveChanges:=wdDoNotSaveChanges
End Sub

Это не идеально, поскольку, если конечный пользователь сделает ошибку при сохранении модели с включенной функцией слияния почты, проблема возникнет снова, но, по крайней мере, она работает, пока вы не прикасаетесь к модели.

0
Neokyr 14 Июн 2021 в 08:31