2

アプリケーション内で手紙を作成するはずの差し込み印刷コードに問題があります。現時点では、このコードが少し荒いことは承知していますが、整理する前に「何かを機能させる」フェーズに入っています。

これが機能するはずの方法、および手動で行う場合の方法は、レターのテンプレートであるファイル (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
4

3 に答える 3

4

私は解決策を見つけました。ドキュメントをマージすると、マージ結果を含む新しいドキュメントが作成されます。以下のコードフラグメントで説明します。

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)
于 2008-10-01T07:00:43.967 に答える
0

問題はこの行だと思います:

wrdDoc.MailMerge.OpenDataSource(templateName)

templateNameは「C:\My Template.doc」のようなものですね。

「.template」ドキュメントにリンクされたデータ ソース (Excel または CSV ファイル、Access テーブルなど) ではなく、Word ドキュメント自体のファイル パスを指定しているようです。

試してください

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
于 2008-09-30T16:15:50.693 に答える
0

ごまかす方法の 1 つは、前述のすべての手順を手動で実行しながらマクロを記録することです。完了したら、マクロをより柔軟に調整します。

それは私が自分のマクロを書いているときにそれを理解できなかった前回のことです:)

于 2008-09-30T16:34:05.347 に答える