Publipostage commencé par VBA dans Access permet d'ouvrir la base de données de mots à nouveau
-
29-09-2019 - |
Question
Je travaille sur une base de données d'accès qui génère des mails avec publipostage appelé à partir du code VBA dans la base de données Access. Le problème est que si j'ouvre un nouveau document Word et commencer le publipostage (VBA), Word ouvre la même base de données Access (qui est déjà ouvert) pour obtenir les données. Est-il un moyen d'empêcher cela? Alors que l'instance déjà ouvert de la base de données est utilisée?
Après quelques tests, je reçois un comportement étrange: Si j'ouvre la base de données d'accès en maintenant la touche SHIFT le publipostage ne pas ouvrir une autre instance d'accès de la même base de données. Si j'ouvre la base de données d'accès sans maintenant enfoncée la touche, je reçois le comportement décrit.
Mon Publipostage code 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
L'ensemble est fait avec Access / Word 2003.
Mise à jour # 1 Il serait également utile si quelqu'un pouvait me dire quelle est la différence exacte entre l'ouverture d'accès avec ou sans la touche SHIFT. Et s'il est possible d'écrire un code VBA pour permettre aux « fonctions » si la base de données est ouverte sans la touche SHIFT, il au moins « simule » il.
Cordialement, Gregor
La solution
Quand je fais mailmerges, je généralement exporter un fichier txt à partir d'Access puis définissez le publipostage DataSource à cela. Cet accès est ainsi que dans l'exportation de la impliqué requête, puis dire le document Word pour faire le travail grâce à l'automatisation, à peu près comme suit:
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
Pour l'utiliser, vous devez configurer vos ressources \ Lettres sous-dossier et mettre votre fichier de mots modèle de mailmerge là-dedans. Vous devez également votre requête « de base » avec les définitions de champ dans votre accès App (dans l'exemple, il est appelé MailMergeExportQry. Mais vous pouvez l'appeler quelque chose.
Vous devez également savoir ce que le filtrage et le tri que vous ferez. Dans l'exemple, ceci est représenté par
sqlWhere = GetWhereClause()
sqlOrderBy = GetOrderByClause
Une fois que vous avez votre tête ronde ces choses, cela est très réutilisable.