saveasとworkbook.close savechanges:=False の競合

一度ハマったのでメモ。

 上記の操作を、Thisworkbookに一定の操作を加えた後、コピーをxlsx形式で保存して、Thisworkbookは上書き保存しないで閉じることを目的としたところ、失敗した。

つまり、先に実行したSaveAsが勝ち、後から実行したSaveChanges:=Falseが負ける。元ファイルが上書き保存されてしまう。観察した結果は後述する。

 当初の目的を実現するには、Thisworkbookのシートを別ブックにコピーしてから、それに名前を付けて保存し、Thisworkbookを保存せずに閉じる。それについては別エントリで記載した。

 もちろん最初はSaveCopyAsを考えたのだが、これは元ファイルと同じ拡張子でないとダメという欠点が存在する。たとえば、Thisworkbookがxlsmで、SaveCopyAsでxlsx

を指定すると、一見保存できているように見えるが、開けない(開こうとするとエラーが出てしまう。)。

 

Sub 保存テスト1()
    Range("A1").Value = 1
    ThisWorkbook.SaveAs ThisWorkbook.Path & "/A1変更後.xlsm"
    ThisWorkbook.Close savechanges:=False
End Sub

 保存テスト1を実行すると、元ファイルのThisworkbookのA1にも「1」、新たに保存した「A1変更後.xlsm」ファイルのA1にも「1」が入っている。つまり、SaveAsでxlsm形式で保存した時点で、元ファイルも、新規ファイルもA1セルに「1」が入った状態で保存され、その後Closeの際SaveChanges:=Falseとしてもう上書き保存されてしまっている。(元ファイルを変更したくないのに、変更してしまっている。)

====20200208add====

 再現されず.元ファイルには「1」なし.上書きされずに済んでいる.

====20200208add==== 

Sub 保存テスト2()
    Range("A1").Value = 2
  'xlsxだとマクロを保存できない旨の警告を無視 Application.DisplayAlerts = False ThisWorkbook.SaveAs ThisWorkbook.Path & "/A1変更後.xlsx", _ FileFormat:=xlOpenXMLWorkbook Application.DisplayAlerts = True ThisWorkbook.Close savechanges:=False End Sub

 保存テスト2を実行すると、元ファイルのThisworkbookのA1にも「2」、新たに保存した「A1変更後.xlsx」ファイルのA1にも「2」が入っている。つまり、SaveAsでxlsm形式で保存した時点で、元ファイルも、新規ファイルもA1セルに「1」が入った状態で保存され、その後Closeの際SaveChanges:=Falseとしてもう上書き保存されてしまっている。(元ファイルを変更したくないのに、変更してしまっている。)

 

====20200208add====

 再現されず.元ファイルには「2」なし.上書きされずに済んでいる.

====20200208add==== 

 

 

 

Sub 保存テスト3()
    Range("A1").Value = 3
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs ThisWorkbook.Path & "/A1変更後xmlなし.xlsx"
    Application.DisplayAlerts = True
    
    ThisWorkbook.Close savechanges:=False
End Sub

 ちなみに、保存テスト3を実行すると、実行時エラー1004

「この拡張子は、選択したファイル形式には使用できません。[ファイル名]ボックスでファイル拡張子を変更するか、[ファイルの種類]ボックスで別のファイル形式を選択してください。」となってしまう。