从Excel运行MS Word邮件合并

时间:2019-12-22 06:11:50

标签: excel vba

我知道之前已经有人问过这个问题,因此我尝试更新另一个线程,但不允许这样做。

我有一个电子表格,其中包含MS邮件合并中使用的数据。我有一个全部设置为运行的Word邮件合并文档。字段已设置。当我打开doc一词时,出现提示“打开此文档将运行以下SQL命令”等,等等。我想要做的是,当我单击a时,让Excel电子表格在没有任何用户干预的情况下运行邮件合并。按钮。我在该论坛上将示例中的以下代码组合在一起,但无法正常工作。运行Word时,我会收到相同的提示。如何使它工作?

Public Sub RunMailMerge(MMFileName As String)

    Dim wdDoc As Object

'   open the mail merge layout file

    Set wdDoc = GetObject(MMFileName, "Word.document")
    wdDoc.Application.Visible = True

    With wdDoc.MailMerge
         .MainDocumentType = wdFormLetters
         .Destination = wdSendToPrinter
         .SuppressBlankLines = True
         .Execute Pause:=False
    End With

'   cleanup

    wdDoc.Close SaveChanges:=False
    Set wdDoc = Nothing

End Sub

我看到的所有示例都使用后期绑定。使用单词对象的早期绑定会更好吗?

谢谢 唐

4 个答案:

答案 0 :(得分:1)

这个概念怎么样?

Sub PushToWord()

Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)

objWord.activedocument.variables("FirstName").Value = Range("FirstName").Value
objWord.activedocument.variables("LastName").Value = Range("LastName").Value

ActiveDocument.Fields.Update

objWord.Visible = True

End Sub

将DocVariables添加到Word文档中,并适当命名。从Excel运行代码。

答案 1 :(得分:0)

有两种基本方法可用于运行邮件合并而不触发提示。请注意,提示是一种安全措施,因为邮件合并运行的SQL 可能会对系统造成危害。提示确保用户意识到这一点,并且(如果)文档来自“受信任的来源”,则(仅)应该运行邮件合并。

  1. 从主合并文档中删除数据源,然后在每次打开文档时使用VBA明确添加数据源

此方法的优点是它支持Word的安全设置。如果用户允许运行VBA,则可以认为整个项目都是受信任的,因此允许使用代码附加数据源。

可以通过选择打开文档而不允许邮件合并(我正在查看的Word版本中标记为“否”的按钮)来从文档中删除数据源。以那种状态保存文档。在执行邮件合并之前,在代码中添加一行以链接到数据源中。

为了弄清楚必要的语法,可以在连接到数据源时记录宏(这是最确定的也是最快的),也可以在断开连接之前从文档中查询数据源。在Word中,在VBA编辑器的“立即窗口”(Ctrl + G)中输入?行,然后按Enter键,一一对应:

?ActiveDocument.MailMerge.DataSource.Name
C:\Users\Cindy Meister\Documents\Personal\klpFeb00.mdb
?Document.MailMerge.DataSource.QueryString
SELECT * FROM `Q_MailMergeInvite`

然后

?ActiveDocument.MailMerge.DataSource.ConnectString

为此按Enter键后,您应该会看到

的内容
Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\Users\[username]\Documents\Personal\Text.mdb;Mode=Read;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False

将这些双引号分配给Name的{​​{1}},SQLStatementConnection参数。

  1. 更改注册表设置以禁用提示

这在Knowledge Base article about the prompt中有描述。

确切的注册表项会有所不同,具体取决于Word的版本,但遵循模式

Document.MailMerge.OpenDataSource

以上内容适用于Word 2013版本15。对于Word 2010,请更改为14; Word 2016等为16。

需要在此位置创建名为HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Word\Options 的类型为DWord的新注册表项。为它分配值SQLSecurityCheck

答案 2 :(得分:-1)

https://support.microsoft.com/en-au/help/825765/you-receive-the-opening-this-will-run-the-following-sql-command-messag

  

“症状”一节中描述的提示是设计使然。

     

此提示存在于所有更高版本的Microsoft Office中,并且   Office XP Service Pack 3中引入了此提示。   “适用于”部分中列出的产品,以使邮件更多地合并   安全。如果在收到提示时单击“是”,则让代码运行   在你的电脑。恶意用户可能能够制作SQL查询   旨在窃取或破坏您有权访问的数据。   如果在收到提示时单击“否”,则不要让代码   运行。

     

注意通过VBA设置DisplayAlerts = none会在出现以下情况时禁止提示   使用VBA打开文件,但使用NO选项打开   文档,并且没有数据附加到邮件合并主文档

答案 3 :(得分:-1)

例如:

Sub MergetoPrint()
Dim wrdObj As Object, wrdDoc As Object, strFile As String
strFile = ThisWorkbook.FullName
Const wdFormLetters As Long = 0
Const wdSendToNewDocument As Long = 0
Const wdSendToPrinter = 1
Const wdSendToEmail As Long = 2
Const wdMergeSubTypeAccess As Long = 1
Const wdMailFormatHTML As Long = 1
Set wrdObj = CreateObject("Word.Application")
With wrdObj
  .Visible = False
  .DisplayAlerts = False
  Set wrdDoc = .Documents.Open(ThisWorkbook.Path & "\MailMergeMainDocument.docx", False, True, False, , , , , , , , False)
  With wrdDoc
    With .MailMerge
      .MainDocumentType = wdFormLetters
      .Destination = wdSendToPrinter
      .SuppressBlankLines = True
      .OpenDataSource Name:=strFile, ReadOnly:=True, AddToRecentFiles:=False, LinkToSource:=False, _
        Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=strFile;Mode=Read;" & _
        "Extended Properties=""HDR=YES;IMEX=1"";", SQLStatement:="SELECT * FROM [Sheet1$]", _
        SQLStatement1:="", SubType:=wdMergeSubTypeAccess
      .Execute
    End With
    .Close 0
  End With
End With
Set wrdDoc = Nothing: Set wrdObj = Nothing
End Sub
相关问题