我知道之前已经有人问过这个问题,因此我尝试更新另一个线程,但不允许这样做。
我有一个电子表格,其中包含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
我看到的所有示例都使用后期绑定。使用单词对象的早期绑定会更好吗?
谢谢 唐
答案 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 可能会对系统造成危害。提示确保用户意识到这一点,并且(如果)文档来自“受信任的来源”,则(仅)应该运行邮件合并。
此方法的优点是它支持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}},SQLStatement
和Connection
参数。
这在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)
“症状”一节中描述的提示是设计使然。
此提示存在于所有更高版本的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