5

私は、Access データベースの VBA コードから呼び出された差し込み印刷でいくつかのメールを生成する Access データベースに取り組んでいます。問題は、新しい Word 文書を開いて差し込み印刷 (VBA) を開始すると、Word が同じ Access データベース (既に開いている) を開いてデータを取得することです。これを防ぐ方法はありますか?すでに開いているデータベースのインスタンスが使用されるようにするには?

いくつかのテストの後、私は奇妙な動作を取得します: SHIFT キーを保持している Access データベースを開くと、差し込み印刷は同じデータベースの他の Access インスタンスを開きません。キーを保持せずに Access データベースを開くと、説明されている動作が発生します。

私の差し込み印刷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

すべてAccess / Word 2003で行われます。

更新 #1 Shift キーを使用して Access を開く場合と使用しない場合の正確な違いを誰かが教えてくれると助かります。また、「機能」を有効にする VBA コードを記述できる場合は、SHIFT キーを使用せずにデータベースを開くと、少なくともそれを「シミュレート」します。

乾杯、グレゴール

4

1 に答える 1

10

差し込み印刷を行うときは、通常、Access から .txt ファイルをエクスポートし、差し込み印刷データソースをそれに設定します。そうすれば、Access はクエリのエクスポートのみに関与し、次に 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

これを使用するには、Resources\Letters サブフォルダーを設定し、そこに差し込み印刷テンプレートの Word ファイルを配置する必要があります。また、Access アプリのフィールド定義を含む "ベース" クエリも必要です (この例では、MailMergeExportQry と呼ばれていますが、任意の名前を付けることができます。

また、どのようなフィルタリングとソートを行うかを理解する必要があります。例では、これは次のように表されます。

sqlWhere = GetWhereClause()
sqlOrderBy = GetOrderByClause

これらのことを理解したら、これは非常に再利用可能です。

于 2010-10-11T15:39:10.837 に答える