Excel VBAで開いたブックを別名保存する際は、Workbook.SaveAs ファイル名 を使いますが、その後Workbook.Closeしても、元のファイルが開いたままとなって、ファイルの削除や移動ができなくなる問題が発生します。この時、全てのExcelファイルを閉じる必要があり、面倒ですので、解決策を公開します。
【NG例】
Public Sub input_data_and_save()
Dim path_book As String
path_book = Application.GetOpenFilename(FileFilter:="Excel File, *.xls*", Title:="Open Excel Book")
If path_book = "False" Then Exit Sub
Dim book_target As Workbook
Set book_target = Workbooks.Open(filename:=path_book)
'book_targetへの操作がここに入る operations for book_target
book_target.SaveAs filename:=book_target.Path & "\Re_" & book_target.Name
book_target.Close
Set book_target = Nothing
End Sub
【改修ポイント】
book_target.SaveAs filename:=book_target.Path & "\Re_" & book_target.Name
book_target.Close
この2行を↓
book_target.Close SaveChanges:=True, _
filename:=book_target.Path & "\Re_" & book_target.Name
このように1行にまとめます。これだけで、ファイルが正しく閉じられるようになります。
SaveAsによってbook_targetの対象が変わってしまい、元のブックを指す変数が迷子になることが問題なのです。
つまり、別名で保存したあとにファイルを閉じる場合は、SaveAsは使うべからず!ということ。
If you close the file after saving under a different name, do not use Workbook.SaveAs, Use Workbook.Close with filename.
SaveAsはあくまで保存だけで、ファイルを閉じるかどうかはユーザーにまかせる場合に使用するfunction、ということです。
0 件のコメント:
コメントを投稿