Stampa unione iniziato da VBA in Access lasciare di nuovo Word Open Database
-
29-09-2019 - |
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
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.