![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
wordの差し込み印刷で、PDFファイルで保存するマクロを作成したのですが、
保存先の「出力」フォルダーに、PDFファイルとワードファイルが作成されます。
不要なワードファイルを削除しようと、
Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
を入れているのですが、ワードファイルが削除できません。
なぜでしょうか?
------------------
Sub 差し込み印刷_レコード毎に別ファイルで保存()
Dim myMainDoc As Document: Set myMainDoc = ActiveDocument
With myMainDoc.MailMerge
'-------------------------------------------
'ファイル名の指定
'-------------------------------------------
Dim myFieldName As String
myFieldName = "出力ファイル名"
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 = myFileName 'ファイル名:通し番号+指定したフィールドの値
'新規文書に名前をつけてdocx形式で保存
Dim myNewDoc As Document: Set myNewDoc = ActiveDocument
myNewDoc.SaveAs FileName:=myMainDoc.Path & "\" & "出力\" & myFileName & ".docx", _
FileFormat:=wdFormatXMLDocument, _
AddToRecentFiles:=False
Dim myFilePath As String '保存先のフォルダパス
Dim myDoc As Document
Dim intPos As Integer 'ピリオドの位置
Set myDoc = ActiveDocument
'拡張子のない名称を取得
myFileName = myDoc.Name
intPos = InStrRev(myFileName, ".")
myFileName = Left(myFileName, intPos - 1)
'PDFファイルで保存
myFilePath = myMainDoc.Path 'Wordファイルと同じフォルダ
myDoc.ExportAsFixedFormat _
OutputFileName:=myFilePath & "\" & "出力\" & myFileName & ".pdf", _
ExportFormat:=wdExportFormatPDF
Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
Set myDoc = Nothing
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
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
やはり開いている自分を削除しようとしたためでしたね。
No.1にあるように「作らない=別名で保存しない」という選択が一番なんでしょが、何か不都合があるのでしょう。
対策としては、一旦ダミーの別名で保存すると、削除対象のファイルは閉じた別物になるはずですので、削除可能になると思います。
試してみてください。
No.2
- 回答日時:
No.1です。
とりあえず、On Error Resume Next
を取り除いてみましたか?
私の説が正しければ、
>Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
で、エラーが起きているはずです。
他にエラーが起きてそこまでたどり着けないのでしたら、途中のPDFファイルの部分は一旦パスして走らせてみてください。
先ずはそこからです。
既にお試しでしたら、この回答はスルーして構いません。
No.1
- 回答日時:
>myNewDoc.SaveAs FileName:=・・・・・・
この処理によって、最初読み込んだマクロを含んだファイルの本体がこちらになっています。
※一般的な操作でいえば、名前を付けて保存するようなもの。
つまり
>Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
は、自分自身を削除しろという命令です。当然、開いていますからエラーが起きませんでしたか?
On Error Resume Nextによってスルーしているのでしょうね。
後で消すくらいなら、最初から作らなければよいのではないですか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
差し込み印刷のレコード数について
-
カレントレコードが無い事を判...
-
ACCESSで大量の更新を行うと「...
-
ファイル書込みで一行もしくは...
-
サブフォームに新規レコードを...
-
Access を×ボタンで閉じ...
-
アクセスでレポートの1印刷内...
-
レコードが存在しなかった場合
-
DataGridViewの、選択されてい...
-
固有レコード識別子の選択とは
-
SQLiteで、ランダムにレコード...
-
レコードセット(ADO.Recordset)...
-
DataGridViewの内容をDBに反映...
-
ADOでエクセルからアクセス...
-
クラスモジュールを使ったレコ...
-
サブレンジ分割されたNDB(富士...
-
ACCESSのフォームで複数レコー...
-
ACCESSで「16389予約済みエラー...
-
【ExcelVBA】Powerクエリーでい...
-
JSPのNULLレコード表示について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
-
レコードが存在しなかった場合
-
カレントレコードが無い事を判...
-
アクセスでレポートの1印刷内...
-
JSPのNULLレコード表示について...
-
DataGridViewの、選択されてい...
-
固有レコード識別子の選択とは
-
Access でレコードセレクタが押...
-
データセットのレコード更新が...
-
レコードセット(ADO.Recordset)...
-
[VBA] ADOの Clone と AddNew
-
DataGridViewの内容をDBに反映...
-
ヘッダレコードとトレーラレコ...
-
DataGridViewにてセル以外をク...
-
差し込み印刷のレコード数について
-
サブレンジ分割されたNDB(富士...
-
ACCESSで大量の更新を行うと「...
-
Access を×ボタンで閉じ...
-
[VB6]プログレスバーコントロー...
おすすめ情報
マクロを含んだワードは、メイン.docm ですし、 "出力\" & myFileName & ".docx"
のmyFileNameは、まったく別の名前です。"出力\" の中には、myFileName.docxと、myFileName .pdfの2つのファイルが残るのです。
On Error Resume Next をはずすと、やはり止まりました
ファイルが見つかりません とでました。
msgbox でファイルのテキストを確認すると正しく表示されています。
ただ、一点気がついたのですが、止まったとき、削除対象ファイルはオープンになっていました。
Zincer さん
No.1にあるように「作らない=別名で保存しない」という選択が一番なんでしょが、何か不都合があるのでしょう。
→これはやったのですが、そうするとPDF作成時にエラーになります。
一旦ダミーの別名で保存すると、削除対象のファイルは閉じた別物になるはずですので、削除可能になると思います。
→ダミーファイルで別名保存してやってみましたが、
MsgBox "削除対象ファイル=" & myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
を設定しましたが、ファイル名は正しいのですが、Killで、やはりファイルがありませんエラーです。