Word Mailmergeの自動化が期待どおりに機能しない
-
03-07-2019 - |
質問
アプリケーション内で文字を生成することになっているいくつかの差し込み印刷コードに問題があります。現時点ではこのコードは少し粗いものであることに気づいていますが、私たちは「何かを動かす」ことに取り組んでいます。それを片付ける前の段階。
今、これが機能するはずの方法と、手動で行うときの動作方法は、レターのテンプレートであるファイル(fileOut変数+" .template")があります。そのテンプレートを開いてマージし、fileOut変数にファイル名として保存します。
ただし、テンプレートファイルのコピーは、マージの出力ではなく、fileoutファイル名に保存されます。
検索しましたが、レンガの壁に頭をぶつけているようです。
datafileは、マージデータを含むデータファイルです。
同じファイルを使用して、手動で行うとすべて機能します。
Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String
Dim ans As String = String.Empty
errorLog = "C:\Temp\Template_error.log"
If (File.Exists(datafile)) Then
Try
' Create an instance of Word and make it invisible.'
wrdApp = CreateObject("Word.Application")
wrdApp.Visible = False
' Add a new document.'
wrdDoc = wrdApp.Documents.Add(fileOut & ".template")
wrdDoc.Select()
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge
wrdDoc.MailMerge.OpenDataSource(datafile)
wrdSelection = wrdApp.Selection()
wrdMailMerge = wrdDoc.MailMerge()
With wrdMailMerge
.Execute()
End With
wrdDoc.SaveAs(fileOut)
wrdApp.Quit(False)
' Release References.'
wrdSelection = Nothing
wrdMailMerge = Nothing
wrdDoc = Nothing
wrdApp = Nothing
ans = "Merged OK"
Call writeToLogFile(errorLog, "This worked, written to " & fileOut)
Catch ex As Exception
ans = "error : exception thrown " & ex.ToString
Call writeToLogFile(errorLog, ans)
End Try
Else
ans = "error ; unable to open Date File : " & datafile
If (logErrors) Then
Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _
"to process it. Filename provided: " & datafile)
End If
End If
Return ans
End Function
解決
解決策を見つけました。ドキュメントをマージすると、マージ結果が含まれる新しいドキュメントが作成されます。以下のコードフラグメントで説明します。
wrdDoc = wrdApp.Documents.Add(TemplateFileName)
wrdDoc.Select()
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge
wrdDoc.MailMerge.OpenDataSource(DataFileName)
wrdSelection = wrdApp.Selection()
wrdMailMerge = wrdDoc.MailMerge()
With wrdMailMerge
.Execute()
End With
' This is the wrong thing to do. It just re-saves the template file you opened. '
'wrdDoc.SaveAs(OutputFileName) '
' The resulting merged document is actually stored '
' in the MailMerge object, so you have to save that '
wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName)
wrdApp.Quit(False)
他のヒント
問題は次の行だと思います:
wrdDoc.MailMerge.OpenDataSource(templateName)
つまり、 templateName は「C:\ My Template.doc」のようなものですか?
「。template」にリンクされているデータソース(ExcelまたはCSVファイル、アクセステーブルなど)ではなく、Word文書自体のファイルパスを指定しているようです。ドキュメント。
試して:
data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
チートの1つの方法は、言及したすべてのステップを手動で実行しながらマクロを記録することです。完了したら、マクロを調整してより柔軟にします。
それは、私が前回自分のマクロを書いているときにそれを理解できなかったときのことです:)