Access / Word 2010 VBA Mail Merge пытается открыть [Foldername].mdb вместо ACCDB Source

Мы пытаемся автоматизировать процесс слияния почты изнутри 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 передаются и содержат допустимое функциональное содержимое.

Ему удается открыть слово, сделать его видимым и открыть шаблон для слияния. Однако в этот момент появляется запрос на подтверждение источника данных и список возможных источников данных. Нажав на флажок "Показать все", я могу прокрутить вниз до базы данных MS Access через ODBC (.mdb, .accdb) и выбрать ее из списка.

Затем отображается поле "Ошибка входа драйвера 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

Единственными другими модификациями, которые мы использовали, было изменение кода в соответствии с нашими целями. Еще раз спасибо всем за ваши ответы. Я бы вознаградил Рему за их ответ, если бы у меня было достаточно репутации, чтобы сделать это!

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
Другие вопросы по тегам