2

我们正在尝试从 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”。将 access 数据库移动到另一个文件夹会导致错误路径更新,以根据包含的文件夹查找相应命名的 mdb 文件。

我不知道它是否相关,但它似乎也在以编辑模板本身的模式打开模板,而不是从该模板生成新文档。

我在这里遗漏了什么还是有人有任何想法?

干杯


在下面 Remou 的帮助下,我们放弃了直接链接到 Access 并使用 Remou 建议的链接中的代码输出到一个临时文本文件,然后从那里合并。

我们修改了代码以删除 CurrentBackendPath() 并更改了对该函数的唯一引用,如下所示:

Private Function GetStartDirectory() As String
    'GetStartDirectory = CurrentBackendPath() & "mm\"
    GetStartDirectory = CurrentProject.Path & "\mm\"
End Function

我们使用的唯一其他修改是将代码更改为特定于我们的目的。再次感谢大家的回复。如果我有足够的声誉,我会支持 Remou 的回应!

4

1 回答 1

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
于 2012-11-01T11:01:32.587 回答