アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

質問者からの補足コメント

  • うーん・・・

    マクロを含んだワードは、メイン.docm ですし、 "出力\" & myFileName & ".docx"
    のmyFileNameは、まったく別の名前です。"出力\" の中には、myFileName.docxと、myFileName .pdfの2つのファイルが残るのです。

      補足日時:2023/09/12 12:59
  • うーん・・・

    On Error Resume Next をはずすと、やはり止まりました
    ファイルが見つかりません とでました。
    msgbox でファイルのテキストを確認すると正しく表示されています。
    ただ、一点気がついたのですが、止まったとき、削除対象ファイルはオープンになっていました。

      補足日時:2023/09/13 17:18
  • うーん・・・

    Zincer さん

    No.1にあるように「作らない=別名で保存しない」という選択が一番なんでしょが、何か不都合があるのでしょう。
    →これはやったのですが、そうするとPDF作成時にエラーになります。

    一旦ダミーの別名で保存すると、削除対象のファイルは閉じた別物になるはずですので、削除可能になると思います。
    →ダミーファイルで別名保存してやってみましたが、
    MsgBox "削除対象ファイル=" & myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
    Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
    を設定しましたが、ファイル名は正しいのですが、Killで、やはりファイルがありませんエラーです。

      補足日時:2023/09/13 19:06

A 回答 (3件)

やはり開いている自分を削除しようとしたためでしたね。


No.1にあるように「作らない=別名で保存しない」という選択が一番なんでしょが、何か不都合があるのでしょう。
対策としては、一旦ダミーの別名で保存すると、削除対象のファイルは閉じた別物になるはずですので、削除可能になると思います。
試してみてください。
    • good
    • 0

No.1です。

とりあえず、
On Error Resume Next
を取り除いてみましたか?
私の説が正しければ、
>Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
で、エラーが起きているはずです。
他にエラーが起きてそこまでたどり着けないのでしたら、途中のPDFファイルの部分は一旦パスして走らせてみてください。
先ずはそこからです。
既にお試しでしたら、この回答はスルーして構いません。
    • good
    • 0

>myNewDoc.SaveAs FileName:=・・・・・・


この処理によって、最初読み込んだマクロを含んだファイルの本体がこちらになっています。
※一般的な操作でいえば、名前を付けて保存するようなもの。
つまり
>Kill myMainDoc.Path & "\" & "出力\" & myFileName & ".docx"
は、自分自身を削除しろという命令です。当然、開いていますからエラーが起きませんでしたか?
On Error Resume Nextによってスルーしているのでしょうね。
後で消すくらいなら、最初から作らなければよいのではないですか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A