Domanda

Sto lavorando su un database di Access che genera alcune mail con la stampa unione chiamato dal codice VBA nel database di Access. Il problema è che se apro un nuovo documento di Word e avviare la stampa unione (VBA), Word apre lo stesso database di Access (che è già aperto) per ottenere i dati. C'è un modo per evitare questo? In modo che l'istanza già aperto del database viene utilizzato?

Dopo alcuni test ho uno strano comportamento: Se apro il database di Access tenendo premuto il tasto Shift la stampa unione non si apre un altro caso di accesso dello stesso database. Se apro il database Access senza tenendo premuto il tasto, ottengo il comportamento descritto.

Il mio stampa unione codice VBA:

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

Il tutto viene fatto con accesso / Word 2003.

Aggiornamento # 1 Sarebbe anche utile se qualcuno potesse dirmi che cosa è la differenza esatta tra l'apertura di accesso con o senza il tasto shift. E se è possibile scrivere del codice VBA per attivare le "caratteristiche", quindi se il database è aperto senza il tasto shift, è almeno "simula" esso.

Saluti, Gregor

È stato utile?

Soluzione

Quando faccio mailmerges, di solito esportare un file txt da Access e quindi impostare l'origine dati di stampa unione per questo. In questo modo L'accesso è coinvolto solo nell'esportazione la query e quindi raccontare il documento di Word per fare il lavoro tramite l'automazione, più o meno come segue:

    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

Per utilizzare questo, è necessario impostare le risorse \ Letters sottocartella e mettere il file di modello di Word stampa unione in là. È inoltre necessario la query "base" con le definizioni dei campi nel vostro accesso App (nell'esempio, si chiama MailMergeExportQry. Ma si può chiamare qualsiasi cosa.

È inoltre necessario capire cosa filtro e ordinamento si farà. Nell'esempio, è rappresentato dalla

sqlWhere = GetWhereClause()
sqlOrderBy = GetOrderByClause

Una volta che avete ottenuto il vostro testa rotonda quelle cose, questo è altamente riutilizzabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top