Publipostage commencé par VBA dans Access permet d'ouvrir la base de données de mots à nouveau

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

  •  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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top