SSブログ

「差し込み印刷」を使わないでExcelからWordへの差し込み(差し込み印刷もどき) [VBA/VBS]


 Wordの「差し込み印刷」は簡単で便利だが、データソースの指定等の人手作業が
必要であり全自動化できない(私の勉強不足?)。
 そこでWordの「差し込み印刷」を使用しないで同等の機能をExcel VBAで作ってみた。
作成にあたりここを参照させて頂きました。
新しくここにCSVデータを表形式にしてWordに差し込む方式を作成してみました。

概要
  • Wordの文書内のExcelデータを差し込む箇所を"{項目名n}"と記述
  • doc.png
  • Excel側に差し込むデータを以下のように記述
  • ファイル名項目名1項目名2・・・
    ファイル名1データ11データ12・・・
    ファイル名2データ21データ22・・・

    excel.png
  • Excelの実行ボタンを押すと、項目名nにデータnを差し込んだファイル名nのWordファイルを作成

サンプル(Excelのデータで請求書をWordで作成作成するサンプル)
  • ダウンロード Wordファイル(template.docx)はこちら、Excelファイル(wordReplacement.xlsm)はこちら
  • サンプルのWord、Excelファイルは同じフォルダー内に保存
  • Excelファイル(dataReplacement.xlsm)を起動すると、セキュリティの警告がでますがコンテンツの有効化ボタンをクリック。
  • 実行ボタンを押すと、表の宛先分の請求書ファイルが同じフォルダーに作成されます。


Excel VBAコード
Option Explicit

 Sub WordDocDupulicate()
    Dim wdApp As Word.Application
    Dim wdDoc As Word.Document
    Dim wdRng As Word.Range
    Dim Fname   As String
    Dim sOutput As String
 
    Dim mPath   As String
    Dim iRowCount As Long
    Dim jColCount As Long
    Dim sh As Worksheet
    Set wdApp = New Word.Application
 
    Const dataSheet As String = "data"
    Const dataItem  As Long = 3         '項目行
    
    Set sh = Worksheets(dataSheet)
    sh.Select
 
    mPath = ActiveWorkbook.Path & "\"
    Fname = mPath & "template.docx"
 
    sOutput = mPath & "\"
    
    On Error GoTo ErrHandler
    'テンプレート文書
    If Dir(Fname) = "" Then
        MsgBox "テンプレート文書がありません。", vbExclamation
        GoTo ErrHandler
    End If
    
    iRowCount = dataItem + 1         '先頭data行
    
    Do
        With wdApp
            Set wdDoc = .Documents.Open(Fname)
            Set wdRng = wdDoc.Content
        End With
        
        jColCount = 1
        Do
            Debug.Print "項目: " & Cells(dataItem, jColCount).Value
            Debug.Print "置換: " & Cells(iRowCount, jColCount).Value
        
            With wdRng.Find
                .Text = "{" & Cells(dataItem, jColCount).Value & "}"
                .Forward = True
                If Cells(dataItem, jColCount).Value = "日付" Then
                    .Replacement.Text = Format(Cells(iRowCount, jColCount).Value, "gggee年mm月dd日")
                Else
                    .Replacement.Text = Cells(iRowCount, jColCount).Value
                End If
                .MatchCase = False
                .MatchWildcards = False
                .MatchFuzzy = True
                '.Execute Replace:=wdReplaceAll 'Ver Word2003
                .Execute , , , , , , , , , , wdReplaceAll
            End With
            jColCount = jColCount + 1
       Loop Until sh.Cells(iRowCount, jColCount).Value = ""
   
       sOutput = mPath & Cells(iRowCount, 1).Value & ".docx"
       Debug.Print "sOutput: " & sOutput
        
       wdDoc.SaveAs sOutput '保存word文書名
       wdDoc.Close False
       iRowCount = iRowCount + 1
   Loop Until sh.Cells(iRowCount, 1).Value = ""
   wdApp.Quit

ErrHandler:
    If Err.Number > 0 Then
        MsgBox Err.Number & " : " & Err.Description
    Else
        Beep '正常終了
    End If
    Set wdRng = Nothing
    Set wdDoc = Nothing
    Set wdApp = Nothing
    Set sh = Nothing
End Sub



nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

山本 益夫

拝見させていただきました。
ワード文書名が英字、コード側の文書名部分がカタカナであるこの以外にミスなく実行しました。すばらしいです。
ところで、私が利用したいのは住所録などハガキ印刷ですが、tyama0467さんのサンプルは各人の名前で文書名が保存され、人数分だけ文書が出来上がりますね、会社の請求書などではそれでもいいのですが、ハガキ印刷などは1つの文書に何ページもつながっていて、印刷作業を1回で済む、もしくは何ページから何ページと指定できたらいいなと思いますが、そんなことはできないですか?
じつは私は市の民生委員をしていて、毎年町内の1500名のお年寄りにハガキを郵送する作業があり、エクセル_ワードでできればいいな と思いコメントさせてもらいました。
現在は、ワードの差し込み印刷を利用していますが、少しエクセルのBVAをかじっているので、関心があります。
宜しくお願いします。
URLはありませんので、メールアドレスを記述しておきます。
address:masumasuyama@yahoo.co.jp
by 山本 益夫 (2017-04-25 05:58) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。