Wordの差し込み印刷で「個々のドキュメントの編集」を選択すると新規文書が作成されますが、複数のレコードの場合も一つの文書ファイルに保存されます。
「1つの文書に保存され、文書の各コピーは改ページで区切られます。」
つまりレコード毎に別のファイルにすることができません。
そこで別のファイルに連続して保存するマクロを考えました。
次の通りです。
Sub 連続個別保存()
recnumfirst = InputBox("最初のレコード番号", "最初のレコード番号")
If recnumfirst = "" Then Exit Sub
recnumlast = InputBox("最後のレコード番号", "最後のレコード番号")
If recnumlast = "" Then Exit Sub
For num = recnumfirst To recnumlast
Call 個別保存(num)
Next num
End Sub
recnumfirst = InputBox("最初のレコード番号", "最初のレコード番号")
If recnumfirst = "" Then Exit Sub
recnumlast = InputBox("最後のレコード番号", "最後のレコード番号")
If recnumlast = "" Then Exit Sub
For num = recnumfirst To recnumlast
Call 個別保存(num)
Next num
End Sub
Function 個別保存(num)
Const savedir = "C:\Data"'保存するフォルダ
'差込実行、Wordファイルを作成
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = num
.LastRecord = num
End With
.Execute
End With
'作成されたWordファイルを保存
fn = savedir & num & ".doc"
ActiveDocument.SaveAs FileName:=fn, FileFormat:=wdFormatDocument
ActiveWindow.Close
End Function
Const savedir = "C:\Data"'保存するフォルダ
'差込実行、Wordファイルを作成
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = num
.LastRecord = num
End With
.Execute
End With
'作成されたWordファイルを保存
fn = savedir & num & ".doc"
ActiveDocument.SaveAs FileName:=fn, FileFormat:=wdFormatDocument
ActiveWindow.Close
End Function
後半の「個別保存」ではレコード番号を一つ指定して差し込みを実行、出来たファイルを保存します。2行目のフォルダを必要に応じて書き換えてください。
前半の「連続個別保存」ではレコード番号の範囲を指定して「個別保存」を連続して実行させます。
Word2007で動作を確認しました。
追記
改良版について書きましたので、そちらもあわせてお読みください。
You Look Too Cool » 差し込み印刷で個別のファイルに差し込む方法-改良版
コメント
いつも参考にさせていただいてます。
私はまったくの初心者です。
「作成されたファイル名」の部分ですが、データソースの10番目のフィールドをファイル名にしたいので、
別のサイトで見つけたものと合体させ、
fn = .DataSource.DataFields(10).Value & “.doc”
としてみたのですがうまくいきません。
ご教授願いたいのですがよろしくお願いします。
>shizuさん
コメントありがとうございます。
GWはパソコンのない環境で過ごしていましたので返事が遅くなり申し訳ありません。
手元にある環境ではWordマクロが使えなかったので間違っていたらごめんなさい。
ご質問の「fn = .DataSource.DataFields(10).Value & “.doc”」ですが
本文に書いたコードの
「With ActiveDocument.MailMerge」と(2番目の)「End With」の間に書く必要があると思います。
いかがでしょうか。
「.Execute」の上に書くと良さそうな気がします。
追記
古いパソコンを起動してやってみました。一応、動きました。
ただし、上の書き方では常に一つ目のレコードを拾ってしまうようです。
つまり、どれも同じファイル名になってしまうので、最後のファイルだけが保存されます。
これでは意味がないですよね。役立たずで申し訳ありません。
なお差し込んだ後の文面から情報を取得する方法があります。
http://stabucky.com/wp/archives/1037
に書いてあるのですが、「何番目の段落」というように指定して文字列を取得できます。
実際に私はこの方法を使って差込印刷時のファイル名に当てはめたことがあります。
お忙しいところ動作確認までしていただいてありがとうございました(^o^)
「何番目の段落」・・・の取得方法については試してみたいと思います。
今後も楽しみに拝見させていただきますね!
>shizuさん
お役に立てず申し訳ありませんでした。
また面白い方法を見つけたら書きますので、よろしくお願いします。
参考にさせていただきました。
上の方のご指摘通り、印刷したい行のレコードを取得していなかったようなので、修正して使わせていただきました。
.DataSource.ActiveRecordの設定が肝だと思うので、その上のFirstRecordなどの指定は不要かとも
思いますが、外して検証していないので、ご参考まで報告いたします。
あと、最後のActiveWindowでのCloseだと、元ファイルがクローズしてしまったので、
こちらもActiveDocumentをCloseする形にして利用させていただきました。
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = num
.LastRecord = num
End With
.DataSource.ActiveRecord = num
Filename = .DataSource.DataFields.Item(“****”)
.Execute
End With
‘作成されたWordファイルを保存
fn = savedir & Filename & “.doc”
ActiveDocument.SaveAs Filename:=fn, FileFormat:=wdFormatDocument
‘ ActiveWindow.Close
ActiveDocument.Close
コメント、ありがとうございます。
重要な手法を二つ教えていただきました。
アクティブなレコードを指定する方法とフィールドの内容を取得する方法です。
これらについては、もう少し整理してまた記事にまとめたいと思います。
[…] 前に差し込み印刷で個別のファイルに差し込む方法という記事を書いたのですが、A-Feさんから上手い方法を教えていただいたので、後半部分のコードを少し書き換えてみました。 Function 個別保存(num) Const savedir = "D:Data" '差込実行、Wordファイルを作成 With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True .DataSource.ActiveRecord = num fn = .DataSource.DataFields.Item([フィールド名]) .Execute End With '作成されたWordファイルを保存 ActiveDocument.SaveAs FileName:=savedir & fn, FileFormat:=wdFormatDocument ActiveWindow.Close End Function […]