これまでに、「【コード】差し込み印刷でレコード毎に別ファイルで保存」と「【コード】差し込み印刷でレコード毎に別ファイルで保存(その2)」を紹介してきました。
doc形式でファイルを保存する:こちらもCHECK
-
-
【Word VBA】差し込み印刷でレコード毎に別ファイルで保存
関連記事(docx形式でファイルを保存します): 【コード】差し込み印刷でレコード毎に別ファイルで保存(その2) 関連記事(チェックしたレコードのみ処理対象にします): 【コード】差し込み印刷でレコー ...
docx形式でファイルを保存する:こちらもCHECK
-
-
【Word VBA】差し込み印刷でレコード毎に別ファイルで保存(その2)
以前紹介しました「【Word VBA】差し込み印刷でレコード毎に別ファイルで保存」を少し修正してみました。 上記の記事では、ファイルの保存形式がWord 2003までの.doc形式でした。 これを、. ...
今回の改良で、チェックしたレコードのみを処理対象にできるようにしました。
ぜひお試しください。
<目次>
このマクロでできること
差し込み印刷の対象としてチェックをつけたレコードだけを処理対象にします。チェックがないレコードはスキップされます。以下、Excelブックに入力したサンプルの名簿でレコードが選択されている状態を示しています。
作成するWord文書のファイル名をフィールドから指定できます。これまでのマクロでは、プログラム中に記述しましたが、今回は実行前にインプットボックスで指定します。
たとえばここでデータの中のフィールドの1つである「名前」と入力すると、この名前を用いてファイル名を作成します。先頭には通し番号が挿入されます。
マクロの解説
ファイル名に使用するフィールドを指定する
10行目~16行目で設定しています。
86行目以降に書かれているIsValidFieldNameファンクションを使い、入力したフィールド名が差し込み印刷のデータで実際に定義されているフィールドなのかを確認します。
チェックしたレコードのみを処理対象にする
実は、今回のマクロでDataSource.Includedプロパティを使い、チェックの入ったレコードのみを処理対象にしようとしましたが、うまくできませんでした。まだオブジェクトの仕組みを正確に理解できておりません。
なので、今回はエラー処理で切り抜けることにしました。
チェックが入っていないレコードを差し込み印刷しようとするとエラーが発生します。なので、エラーが発生しないときだけファイルを作成し(50行目~69行目)、エラーが発生したらエラーを解除して(71行目~76行目)次のレコードに進むという流れです。
マクロ
Sub 差し込み印刷_レコード毎に別ファイルで保存3()
Dim myMainDoc As Document: Set myMainDoc = ActiveDocument
With myMainDoc.MailMerge
'-------------------------------------------
'ファイル名の指定
'-------------------------------------------
Dim myFieldName As String
myFieldName = InputBox("ファイル名に使用するフィールド名を入力してください。", _
"ファイル名の設定")
If IsValidFieldName(.DataSource.FieldNames, myFieldName) = False Then
MsgBox "フィールド名が間違っています", vbExclamation
Exit Sub
End If
'-------------------------------------------
'差し込み印刷の設定
'-------------------------------------------
'新規文書に書き出す
.Destination = wdSendToNewDocument
'空白の差し込みフィールドを印刷しない
.SuppressBlankLines = True
'-------------------------------------------
'本処理
'-------------------------------------------
Dim i As Integer 'レコード番号
Dim iMax As Integer '対象となる最終レコード番号(レコード数ではない)
.DataSource.ActiveRecord = wdLastRecord
iMax = .DataSource.ActiveRecord
Dim j As Integer: j = 0 '作成したファイルの通し番号
For i = 1 To iMax '全レコードを対象にループ処理
'レコードの指定(1つのレコードに限定)
With .DataSource
.FirstRecord = i
.LastRecord = i
.ActiveRecord = i
End With
On Error Resume Next
.Execute
If Err = 0 Then
'-------------------------------------------
'レコードが対象として選択されている場合:差し込み印刷を実行
'-------------------------------------------
j = j + 1
Dim myFileName As String: myFileName = .DataSource.DataFields(myFieldName).Value
If myFileName = "" Then myFileName = "★" & myFieldName & ":不明★"
myFileName = j & "_" & myFileName 'ファイル名:通し番号+指定したフィールドの値
'新規文書に名前をつけてdocx形式で保存
Dim myNewDoc As Document: Set myNewDoc = ActiveDocument
myNewDoc.SaveAs FileName:=myMainDoc.Path & "\" & myFileName & ".docx", _
FileFormat:=wdFormatXMLDocument, _
AddToRecentFiles:=False
myNewDoc.Close
DoEvents
Set myNewDoc = Nothing
Else
'-------------------------------------------
'レコードが対象として選択されていない場合:エラー発生
'-------------------------------------------
Err.Clear
End If
Next i
End With
Set myMainDoc = Nothing
End Sub
Function IsValidFieldName(myFieldNames As Object, myFieldName As String) As Boolean
IsValidFieldName = False
Dim myName As Object
For Each myName In myFieldNames
If myName.Name = myFieldName Then
IsValidFieldName = True
Exit For
End If
Next
End Function
関連記事
【コード】差し込み印刷でレコード毎に別ファイルで保存(その2)
同じキーワードの記事をお探しなら
![]() |
![]() |










