Mail Merge Merge, созданный VBA в Access, пусть Word открытая база данных снова

StackOverflow https://stackoverflow.com/questions/3905580

  •  29-09-2019
  •  | 
  •  

Вопрос

Я работаю над базой данных доступа, которая генерирует некоторые почты с Mail Merge, вызываемым из кода VBA в базе данных доступа. Проблема в том, что если я открываю новый документ Word и запустите Mail Merge (VBA), Word открывает одинаковую базу данных доступа (которая уже открыта), чтобы получить данные. Есть ли способ предотвратить это? Так что уже открытый экземпляр базы данных используется?

После некоторого тестирования я получаю странное поведение: если я открою базу данных доступа, удерживая клавишу Shift, Mail Merge не открывает другой экземпляр доступа одной базы данных. Если я открою базу данных доступа, не удерживая ключ, я получаю описанное поведение.

Моя почта Merge VBA Code:

On Error GoTo ErrorHandler

    Dim word As word.Application
    Dim Form As word.Document

    Set word = CreateObject("Word.Application")
    Set Form = word.Documents.Open("tpl.doc")

    With word
        word.Visible = True

        With .ActiveDocument.MailMerge
            .MainDocumentType = wdMailingLabels
            .OpenDataSource Name:= CurrentProject.FullName, ConfirmConversions:=False, _
                ReadOnly:=False, LinkToSource:=False, AddToRecentFiles:=False, _
                PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
                WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
                SQLStatement:="[MY QUERY]", _
                SQLStatement1:="", _
                SubType:=wdMergeSubTypeWord2000, OpenExclusive:=False
            .Destination = wdSendToNewDocument
            .Execute
            .MainDocumentType = wdNotAMergeDocument
        End With
    End With

    Form.Close False
    Set Form = Nothing

    Set word = Nothing

Exit_Error:
    Exit Sub
ErrorHandler:
    word.Quit (False)
    Set word = Nothing
    ' ...
End Sub

Все это делается с доступом / словом 2003.

Обновление № 1Это также поможет, если кто-то может сказать мне, какова точная разница между открытием доступа с или без ключа Shift. И если можно написать какой-то код VBA, чтобы включить «функции», так что если база данных открыта без клавиши Shift, она, по крайней мере, «имитирует».

Ура, Грегор

Это было полезно?

Решение

Когда я делаю Mailmerges, я обычно экспортирую файл .txt из Access, а затем устанавливаю на это дат данных Mail Merge. Таким образом, доступ участвует только в экспорте запроса, а затем сообщена документу Word для выполнения работы с помощью автоматизации, примерно следующим образом:

    Public Function MailMergeLetters() 
           Dim pathMergeTemplate As String
            Dim sql As String
            Dim sqlWhere As String
            Dim sqlOrderBy As String


'Get the word template from the Letters folder  

            pathMergeTemplate = "C:\MyApp\Resources\Letters\"

'This is a sort of "base" query that holds all the mailmerge fields
'Ie, it defines what fields will be merged.

            sql = "SELECT * FROM MailMergeExportQry" 

            With Forms("MyContactsForm")

' Filter and order the records you want
'Very much to do for you

            sqlWhere = GetWhereClause()
            sqlOrderBy = GetOrderByClause()

            End With

' Build the sql string you will use with this mail merge

            sql = sql & sqlWhere & sqlOrderBy & ";"

'Create a temporary QueryDef to hold the query

                Dim qd As DAO.QueryDef
                Set qd = New DAO.QueryDef
                    qd.sql = sql
                    qd.Name = "mmexport"

                    CurrentDb.QueryDefs.Append qd

' Export the data using TransferText

                        DoCmd.TransferText _
                            acExportDelim, , _
                            "mmexport", _
                            pathMergeTemplate & "qryMailMerge.txt", _
                            True
' Clear up
                    CurrentDb.QueryDefs.Delete "mmexport"

                    qd.Close
                Set qd = Nothing

'------------------------------------------------------------------------------
'End Code Block:
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
'Start Code Block:
'OK. Access has built the .txt file.
'Now the Mail merge doc gets opened...
'------------------------------------------------------------------------------

                Dim appWord As Object
                Dim docWord As Object

                Set appWord = CreateObject("Word.Application")

                    appWord.Application.Visible = True

' Open the template in the Resources\Letters folder:

                    Set docWord = appWord.Documents.Add(Template:=pathMergeTemplate & "MergeLetters.dot")

'Now I can mail merge without involving currentproject of my Access app

                        docWord.MailMerge.OpenDataSource Name:=pathMergeTemplate & "qryMailMerge.txt", LinkToSource:=False

                    Set docWord = Nothing

                Set appWord = Nothing

'------------------------------------------------------------------------------
'End Code Block:
'------------------------------------------------------------------------------

        Finally:
            Exit Function

        Hell:
            MsgBox Err.Description & " " & Err.Number, vbExclamation, APPHELP

        On Error Resume Next
            CurrentDb.QueryDefs.Delete "mmexport"

            qd.Close
            Set qd = Nothing

            Set docWord = Nothing
            Set appWord = Nothing

            Resume Finally

        End Function

Чтобы использовать это, вам необходимо настроить какие-либо ресурсы буквы подпапки и поместите файл Word Template MailMerge. Вам также нужна ваша «базовая» запрос с определениями поля в вашем приложении доступа (в этом примере называется MailMergeExportqry. Но вы можете назвать это чем угодно.

Вам также нужно выяснить, какую фильтрацию и сортировку вы будете делать. В этом примере это представлено

sqlWhere = GetWhereClause()
sqlOrderBy = GetOrderByClause

После того, как вы обрушитесь на голову, это очень используется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top