VBA

SaveAsとSaveCopyAsの違いは?

記事内に商品プロモーションを含む場合があります
  • SaveAs
    元のファイルは変更しないで、新規ファイルを作成する
  • SaveCopyAs
    元のファイルのコピーを保存。
    その後の処理したプログラムは元のファイルに影響する
  • 使い分け
    元のファイルを変化させたくない ⇒ SaveAs
    元のファイルにも変化を与え、ファイルを複製する ⇒ SaveCopyAs
  • プログラムを終了した後にアクティブなのは
    SaveAs ⇒ 新しく生成、保存したファイル
    SaveCopyAs ⇒ 元のファイル

こんにちはhokkyokunです。
SaveAsとSaveCopyAsをなんとなく使っていたのですが、
ちゃんと時系列で確認したことなかったのでまとめてみました。

結論を言うと…

結論から言います。
図にまとめてみました。

イメージとしては
SaveAsは「名前をつけて保存」
SaveCopyAsは「ファイルの複製」

プログラムの流れは以下を想定します。

  1. セルA1にaが入力されている。
  2. セルA1をa’に変更する
  3. SaveAsメソッド もしくは SaveCopyAsメソッド
  4. セルA1をbに変更する

SaveAsもSaveCopyAsも新しいファイルを作る

SaveAsもSaveCopyAsもどちらも共通して言えることなのですが、

  • Saveは基本的に今扱っているファイルを上書き保存
    →ファイル数は増えません
  • SaveAsもSaveCopyAsも今扱っているファイルと異なるものを生成する
    →ファイルは増えます

SaveAsもSaveCopyAsもファイルが増えるということでは共通ですが、
元ファイルや新規ファイルの扱いに決定的な違いがあります。

SaveAsは元のファイルは変化しない

上記の図で示していますが、詳細を説明します。
流れは下記のとおりです。
元のファイル「保存.xlsm」にプログラムを記述し、このファイルから実行します。

  1. セルA1の値は aとなっている。
  2. セルA1の値を a ⇒ a’
  3. Saveasメソッドで新規ファイル「SaveAs.xlsm」を保存
  4. セルA1の値を a’ ⇒ b
Sub Saveas()

'格納するパス名
Dim filePath As String
filePath = ThisWorkbook.Path & "\"

'マクロを動かしているファイルのA1の値を a → a' に変更
ThisWorkbook.Worksheets(1).Range("A1").Value = "a'"

'ファイル名を「SaveAs.xlsm」にしてSaveAsメソッドで保存
ThisWorkbook.Saveas filePath & "SaveAs.xlsm"

'マクロを動かしているファイルのA1の値を a' → b に変更
ThisWorkbook.Worksheets(1).Range("A1").Value = "b"

End Sub

「保存.xlsm」 マクロを動かす前

「保存.xlsm 」 マクロを動かした後

「保存.xlsm」はマクロを動かした前も後も変化はありません。

一方、新たに生成した「SaveAs.xlsm」は
a’から始まり、

a’→bとなります。

「SaveAs.xlsm」のほうは a’ から始まり、 b となりました。

SaveAsの場合は

  • 元のファイルは変化がまったくされていないことが分かりました。
  • また、SaveAsメソッド後のプログラムは新規保存した「SaveAs.xlsm」ファイルに反映されていました。
  • プログラム終了後、アクティブなのは新規保存した「SaveAs.xlsm」です。

SaveCopyAsは元のファイルが変化する

先ほどのコードとほとんど同じです。

  • セルA1の値は aとなっている。
  • セルA1の値を a ⇒ a’
  • SaveCopyAsメソッドで新規ファイル「SaveCopyAs.xlsm」を保存
  • セルA1の値を a’ ⇒ b
Sub SaveCopyAs()

'格納するパス名
Dim filePath As String
filePath = ThisWorkbook.Path & "\"

'マクロを動かしているファイルのA1の値を a → a' に変更
ThisWorkbook.Worksheets(1).Range("A1").Value = "a'"

'ファイル名を「SaveCopyAs.xlsm」にしてSaveCopyAsメソッドで保存
ThisWorkbook.SaveCopyAs filePath & "SaveCopyAs.xlsm"

'マクロを動かしているファイルのA1の値を a' → b に変更
ThisWorkbook.Worksheets(1).Range("A1").Value = "b"

End Sub

「保存.xlsm」 マクロを動かす前

「保存.xlsm」 マクロを動かした後

「保存.xlsm」の方で変化が生じました。

一方、新たに生成した「SaveCopyAs.xlsm」は

a’ となっています。

SaveCopyAsの場合は

  • SaveCopyAsメソッド後のプログラムは元のファイルに反映されていました
    逆に新規保存した「SaceCopyAs.xlsm」には反映されていませんでした
  • プログラム終了後、アクティブなのは新規保存した「SaveCopyAs.xlsm」です。

SaveAsとSaveCopyAsの違いを図解

すでに投じた図ですが、もう一度貼り付けます。

文章化すると

  • SaveAsは元のファイルは変えず、新規ファイルを作成
  • SaveCopyAsはファイルを複製する
  • プログラム後のアクティブなファイルに違いがある
    SaveAs : 新規ファイル
    SaveCopyAs : 元のファイル

使い分け

元のファイルを変化させたいかさせたくないかが重要になってくると思います

  • 元のファイルを全く変化させたくない→SaveAs
  • 元のファイルと新たに生成したファイルを同期させたい→SaveCopyAs
  • さらにそこから元のファイルに何らかの変化を与えたい(例えばシリアル番号を最後入力するなど)
  • →途中にSaveCopyAsを入れて、その後元ファイルに処理したい内容を記述

私がVBA覚えたてのときに使った本です。
体型的にまとめてくれているので、今でも役立ってます。

まだまだ面白い使い方があるかもしれません。
思いついたら記事書きます。

ではでは。