Mail Merge Merge, созданный VBA в Access, пусть Word открытая база данных снова
-
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
После того, как вы обрушитесь на голову, это очень используется.