/*Google AdSense自動広告*/

2018年7月25日水曜日

Excel VBAでブックを別名保存した際に、元のファイルが開かれたままになる問題の解決方法 Excel VBA : after SaveAs, file stays open problem

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 件のコメント:

コメントを投稿