从 Excel 文件中打开 OLEObject word 文档时如何防止出现 "mail merge" 警告
How to prevent "mail merge" warning to appear when opening an OLEObject word document from inside an Excel File
我创建了一个包含两个单词字母的 excel 工作簿,并创建了一个 VBA 脚本,该脚本使用工作簿本身内部的数据自动邮件合并所述字母。
然而,当我使用“OLEObject.Activate”打开字母时,我遇到了两个问题:
- 文档系统地显示“邮件合并”警告
- 所述警告系统地置于后台,迫使您执行“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
简单的答案是不要在您的工作簿中嵌入邮件合并主文档。在嵌入它们之前将它们作为普通文档保存在 Excel 之外。这也意味着您的 VBA 代码需要包含相关的 SQL 查询代码。
所以我遵循了 macropod 的建议,这里是最终结果:
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
它并不完美,因为如果最终用户在启用邮件合并的情况下保存模型时出错,问题会再次出现,但至少只要您不接触模型,它就会起作用。
我创建了一个包含两个单词字母的 excel 工作簿,并创建了一个 VBA 脚本,该脚本使用工作簿本身内部的数据自动邮件合并所述字母。
然而,当我使用“OLEObject.Activate”打开字母时,我遇到了两个问题:
- 文档系统地显示“邮件合并”警告
- 所述警告系统地置于后台,迫使您执行“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
简单的答案是不要在您的工作簿中嵌入邮件合并主文档。在嵌入它们之前将它们作为普通文档保存在 Excel 之外。这也意味着您的 VBA 代码需要包含相关的 SQL 查询代码。
所以我遵循了 macropod 的建议,这里是最终结果:
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
它并不完美,因为如果最终用户在启用邮件合并的情况下保存模型时出错,问题会再次出现,但至少只要您不接触模型,它就会起作用。