2

Access 内から差し込み印刷プロセスを自動化しようとしています。ボタンをクリックすると、現在のデータベース (accdb) をデータ ソースとして指定する VBA が実行され、次のコードに従って SQL が実行されます。

'Set up Word
Dim objWord As Object
Set objWord = CreateObject("Word.Application")

'Make visible, open specified doc to merge
With objWord
    .Visible = True
    .Documents.Open strDocName
End With

'Set the data source path
Dim docPath As String
docPath = CurrentProject.Path & "\" & CurrentProject.Name

'Open the merge data source - simplified
objWord.activedocument.mailmerge.opendatasource _
    Name:=docPath, _
    SQLStatement:=strSQL

strDocName と strSQL が渡され、有効で機能的なコンテンツが含まれています。

Word を開いて表示し、マージ先のテンプレートを開くことに成功します。ただし、その時点で、データ ソースの確認を求めるメッセージが表示され、可能なデータ ソースのリストが表示されます。[すべて表示] チェックボックスをクリックすると、ODBC (.mdb、.accdb) 経由で MS Access データベースまでスクロールダウンし、リストから選択できます。

次に、「ODBC Microsoft Access Driver のログインに失敗しました」というタイトルのボックスが表示され、「ファイルが見つかりませんでした: "[データベース フォルダーへのパス]/[格納フォルダーの名前].mdb"」というメッセージが表示されます。

したがって、データベースが C:\Temp にある場合、エラー パスは「C:\Temp.mdb」となります。Access データベースを別のフォルダーに移動すると、エラー パスが更新され、含まれているフォルダーに基づいて、それに応じて名前が付けられた mdb ファイルが検索されます。

関連性があるかどうかはわかりませんが、テンプレートから新しいドキュメントを生成するのではなく、テンプレート自体を編集するモードでテンプレートを開いているようです。

ここで何かが足りないのですか、それとも誰かアイデアがありますか?

乾杯


以下の Remou の助けを借りて、Access への直接リンクを断念し、Remou の提案されたリンクのコードを使用して一時テキスト ファイルに出力し、そこからマージしました。

コードを変更して CurrentBackendPath() を削除し、この関数への唯一の参照を次のように変更しました。

Private Function GetStartDirectory() As String
    'GetStartDirectory = CurrentBackendPath() & "mm\"
    GetStartDirectory = CurrentProject.Path & "\mm\"
End Function

他に使用した唯一の変更は、目的に合わせてコードを変更することでした。回答をくださった皆様に改めて感謝いたします。私がそうするのに十分な評判があれば、Remouの反応に賛成票を投じます!

4

1 に答える 1

1

MS Access ファイルにリンクしないことを強くお勧めします。必要なデータをテキスト ファイルに出力し、そこにリンクします。Access へのリンクは、手動で制御された差し込み印刷には非常に適していますが、自動化したい場合は非常に面倒です。http://www.tek-tips.com/faqs.cfm?fid=5088をお読みください。

そうは言っても、マクロを記録すると、次のようになります。

ActiveDocument.MailMerge.OpenDataSource Name:="Z:\Docs\Test.accdb", _
    ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
    AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
    WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
    Format:=wdOpenFormatAuto, Connection:= _
    "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=Z:\Docs\Test.accdb;Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk" _
    , SQLStatement:="SELECT * FROM `Table1`", SQLStatement1:="", SubType:= _
    wdMergeSubTypeAccess

上記のほとんどは不要ですが、接続文字列が含まれていることがわかります。これは、以前のバージョンには当てはまりませんでした。あなたはでやっていくことができます:

With objWord.ActiveDocument.MailMerge
    .OpenDataSource Name:="Z:\Docs\Test.accdb", _
        ConfirmConversions:=False, LinkToSource:=True, _
        Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Z:\Docs\Test.accdb;" _
        , SQLStatement:="SELECT * FROM `Table1`"
End With
于 2012-11-01T11:01:32.587 に答える