我们正在尝试从Access中自动执行邮件合并过程 - 在单击按钮时,VBA运行指定当前数据库(accdb)作为数据源并按照以下代码运行SQL:
'Set up Word
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
'Make visible, open specified doc to merge
With objWord
.Visible = True
.Documents.Open strDocName
End With
'Set the data source path
Dim docPath As String
docPath = CurrentProject.Path & "\" & CurrentProject.Name
'Open the merge data source - simplified
objWord.activedocument.mailmerge.opendatasource _
Name:=docPath, _
SQLStatement:=strSQL
传入strDocName和strSQL并包含有效的功能内容。
成功打开单词,使其可见并打开要合并的模板。然而,在那时,它要求确认数据源,并显示可能的数据源列表。单击“全部显示”复选框后,我可以通过ODBC(.mdb,.accdb)向下滚动到MS Access数据库,然后从列表中选择它。
然后出现一个标题为“ODBC Microsoft Access驱动程序登录失败”的框,说“无法找到文件:”[数据库文件夹的路径] / [包含文件夹的名称] .mdb“'
因此,如果我的数据库位于C:\ Temp,则错误路径将显示为“C:\ Temp.mdb”。将访问数据库移动到另一个文件夹会导致错误路径更新,根据包含的文件夹查找相应命名的mdb文件。
我不知道它是否相关,但它似乎也是在编辑模板本身的模式下打开模板,而不是从该模板生成新文档。
我在这里遗漏了什么,或者有没有人有任何想法?
干杯
在下面的Remou的帮助下,我们放弃了直接链接到Access并使用Remou建议链接的代码输出到临时文本文件,然后从那里合并。
我们修改了代码以删除CurrentBackendPath()并更改了对此函数的唯一引用,如下所示:
Private Function GetStartDirectory() As String
'GetStartDirectory = CurrentBackendPath() & "mm\"
GetStartDirectory = CurrentProject.Path & "\mm\"
End Function
我们使用的唯一其他修改是将代码更改为特定于我们的目的。再次感谢大家的回复。如果我有足够的声誉,我会支持Remou的回复!
答案 0 :(得分:1)
我强烈建议您不链接到MS Access文件。输出文本文件所需的数据并链接到该文件。链接到Access对于手动控制的邮件发送来说非常好,但是当您希望自动化时,它会变得非常繁琐。您可能希望阅读http://www.tek-tips.com/faqs.cfm?fid=5088
话虽这么说,录制宏,我得到以下内容:
ActiveDocument.MailMerge.OpenDataSource Name:="Z:\Docs\Test.accdb", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=Z:\Docs\Test.accdb;Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk" _
, SQLStatement:="SELECT * FROM `Table1`", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess
上述大部分内容都是不必要的,但您会看到它包含一个连接字符串。在早期版本中并非如此。你可以通过:
With objWord.ActiveDocument.MailMerge
.OpenDataSource Name:="Z:\Docs\Test.accdb", _
ConfirmConversions:=False, LinkToSource:=True, _
Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Z:\Docs\Test.accdb;" _
, SQLStatement:="SELECT * FROM `Table1`"
End With