Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Word 2010)
差し込み印刷のデータの相対パス指定
投稿日時: 17/04/22 22:35:33
投稿者: とんび

Word の差し込み印刷でExcelのデータファイルを指定するとき、相対パスでの指定ができないですよね。その結果、差し込み印刷をするWordファイルを配布しても、改めてデータファイルの設定をし直さなければなりません。
 
VBAを使って、たとえば、Wordファイルと同じフォルダーにあるExcelファイルを差し込みデータとして指定することはできないでしょうか。それが可能なら、配布先で自動的にデータファイルの指定ができることになるので巣が…

回答
投稿日時: 17/04/23 08:54:56
投稿者: i-brown

差し込み印刷は詳しくありませんが、
DocumentのMailMergeオブジェクトを取得し、以下のページの指示に従ってプロパティを制御すれば良いのではないでしょうか?
 
https://msdn.microsoft.com/ja-jp/library/office/ff841005.aspx

投稿日時: 17/04/24 09:28:07
投稿者: とんび

i-brownさん、レスありがとうございます。
 

i-brown さんの引用:

DocumentのMailMergeオブジェクトを取得し、…

 
なるほど、Mailmergeオブジェクトのあたりを調べればいいのですね。しばらく、WordのVBAから遠ざかっていたので、「まずはオブジェクトを確認して、その周りを調べる」という勘を忘れていました。
 
ただ、じっさいにExcelのシートを指定している例を誰かが教えてくれるのを期待して、このスレッドはもう少し閉じないでおきます。
 

回答
投稿日時: 17/04/27 12:25:46
投稿者: Pin

こんな感じでしょうか
 
Private Sub Document_Close()
    'フォルダ移動したときのエラー回避のため終了時に通常文書に戻す
    ThisDocument.MailMerge.MainDocumentType = wdNotAMergeDocument
End Sub
 
Private Sub Document_Open()
    Dim MyFile As String
    Dim MySheet As String
    Dim strSQL As String
     
    MyFile = ThisDocument.Path & "\ファイル名.xlsx"
    MySheet = "シート名"
    strSQL = "SELECT * FROM `" & MySheet & "$`"
     
    If Len(Dir(MyFile)) = 0 Then
        MsgBox ("ファイル名.xlsxを同一フォルダに保存してください")
        Exit Sub
    End If
 
    '差込の再設定
    ThisDocument.MailMerge.OpenDataSource Name:=MyFile, SQLStatement:=strSQL
    '差し込んだデータの表示(結果のプレビュー)
    ThisDocument.MailMerge.ViewMailMergeFieldCodes = False
End Sub

投稿日時: 17/04/29 21:16:31
投稿者: とんび

Pinさんありがとうございました。
 

Pin さんの引用:

Private Sub Document_Close()
    'フォルダ移動したときのエラー回避のため終了時に通常文書に戻す
    ThisDocument.MailMerge.MainDocumentType = wdNotAMergeDocument
End Sub

 
この部分が肝心なのですね。これは要するに「データソースと差し込み文書の連携をいったん切っておく」ということに相当するわけですね。これをしておかないと、文書を再オープンした時に、自動的に直前に使ったデータソースとの連携を再構築しようとする。もとのデータソースは、文書中にフルパスで保存されているので、(1)フォルダーを変えたとき、(2)他のユーザーに配布した時に、データソースが見つからなくなってしまう。
 
教えていただいた方法でほぼ、期待通りの結果が得られるようになりました。ありがとうございました。