Access / Word 2010 VBA邮件合并尝试打开[Foldername] .mdb而不是ACCDB源

时间:2012-11-01 06:15:09

标签: vba ms-access odbc mailmerge

我们正在尝试从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的回复!

1 个答案:

答案 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