Excelで作業しているとき、大きな間違いに気付いて以前の内容に戻したいことがありますが、上書き保存してしまっていて戻せないケースがあります。
そこである程度、作業したらファイル名を変えて保存するという方法があります。
エクセルで「上書き保存」は事故のもと。では、どうするか?|外資系投資銀行のエクセル仕事術 ウェブ版|ダイヤモンド・オンライン
ここで紹介されているのは、ファイル名の後ろに日付と番号を付けて保存しておく方法。
これが実行できれば確実ですが、手動で入力して保存するのは結構、面倒です。
そこでマクロを作ってみました。
日付を取得するのは簡単ですが、連番を付けるのは面倒なので、時分秒をセットすることにします。
マクロを実行するとまず作業中のファイルが上書き保存されます。
さらに作業中のファイル名が「abcde.xlsx」ならば「abcde_20150316_123520.xlsx」のようにファイル名に日時を付加して別名で保存されます。
保存したらこれを閉じて、元の「abcde.xlsx」が開きます。作業を続けます。
Const datetime = "_yyyymmdd_hhmmss"
Dim oldfn, newfn, pos
ActiveWorkbook.Save
oldfn = ActiveWorkbook.FullName
pos = InStrRev(oldfn, ".")
newfn = Left(oldfn, pos - 1) _
& Format(Now(), datetime) _
& Right(oldfn, Len(oldfn) - pos + 1)
ActiveWorkbook.SaveAs Filename:=newfn
ActiveWindow.Close
Workbooks.Open Filename:=oldfn
End Sub
「datetime = “_yyyymmdd_hhmmss”」で日時の形式を指定します。この場合、「_年月日_時分秒」となります。保存頻度が1時間に1度ならば「datetime = “_yyyymmdd_hh”」でもいいかもしれません。
InStrRevは文字列の右から目的の文字を探す関数です。ここでは拡張子を調べるために右から「.」の位置を取得しています。つまり拡張子は「.xlsx」でも「.xls」でもOKです。拡張子の前に日時を挿入しています。
上のコードの場合、元のファイルと同じフォルダに履歴付きファイルが保存されます。
履歴付きファイルを専用のフォルダにフォルダにまとめて保存する場合には次のようにします。
Const datetime = "_yyyymmdd_hhmmss"
Const myfolder = "D:\trash\"
Dim oldfn, newfn, pos
ActiveWorkbook.Save
oldfn = ActiveWorkbook.Name
pos = InStrRev(oldfn, ".")
newfn = myfolder _
& Left(oldfn, pos - 1) _
& Format(Now(), datetime) _
& Right(oldfn, Len(oldfn) - pos + 1)
ActiveWorkbook.SaveAs Filename:=newfn
ActiveWindow.Close
Workbooks.Open Filename:=oldfn
End Sub
「myfolder = “D:\trash\”」の箇所で専用フォルダを指定します。「どうせ使わなければ捨てる」という意味でフォルダ名を「trash」としています。
2020年9月7日追記
「myfolder = “D:\trash\”」の部分が「myfolder = “D:\trash”」となっていました。修正しました。
コメント
[…] 以前、Excelのファイル名に日時を付けて保存するマクロを紹介しました。 ファイルを上書き保存する際に別途、日時を付けたファイルを保存することで「うっかり上書き」を防ぎます。 今回はこれのWord版を作りました。 […]
お世話になっております。
今回私のやりたいことに完全にマッチしていたので
完コピさせていただきました。
私の環境では文字部分が赤くなり「コンパイルエラー 構文エラー」と出てしまいました。
なにか設定が足りないのでしょうか。
どうかご教示お願いいたします。
エラー部分を下記に記入いたします。
—————————
newfn = myfolder _
& Left(oldfn, pos – 1) _
& Format(Now(), datetime) _
& Right(oldfn, Len(oldfn) – pos + 1)
>YUIさん
確認したところ「&」とすべきところ「&」となっていました。上の記事内のコードを修正しました。
「&」を「&」にして再度試していただけますでしょうか。
※「&」は文字列を連結するときに使用します。
無事、データの保存ができました!
今後活用させていただきます。
この度はありがとうございました。
>YUIさん
正しく動作したようで安心しました。
はじめまして。
上記コードを入れたのですが最後、元のファイルが開きません、VBA初心者で。
回答宜しくお願いします。
Yasuさん
「履歴付き保存_専用フォルダ」をお使いでしょうか。
コードに誤りがありました。
修正しましたので再度試していただけると助かります。
よろしくおねがいします。
ありがとうございます。
早速試してみますが上に記載されたコードを入れても元のファイルが開かないのですが?
Yasuさん
まずマクロの使い方についてはhttps://stabucky.com/wp/archives/13029を参照してください。
次に「履歴付き保存」を使う場合で説明します。
「履歴付き保存」のコードを例えば「履歴付き保存.xlsm」というファイルに保存します。
これとは別に日時を付けて保存したいファイルを開きます。適当な名前で保存します。
メニューの 表示 – マクロ – マクロ – マクロの表示 で「履歴付き保存.xlsm!履歴付き保存」を選択して実行を押します。
これで名前付きのファイルが保存され元のファイルが開きます。
使わせていただきました。
ありがとうございます!
>Sさん
お役に立てたのであれば嬉しいです。
大変ありがたいマクロ公開いただきありがとうございました。
このマクロを入れたExcelファイルをオンラインのSharePoint上に置いてあります。
保存するときSharePoint上の別フォルダに保存したいと思っています。
myfolder = “D:\trash\”の””の間にSharePointのロケーションURLを入れたのですが、エラーになります。
良い方法をご存じであれば教えていただけますと幸いです。
>ノノさん
シェアポイントを使う場合の設定方法を知りません。
調べてみますが、お約束はできません。
>ノノさん
私の環境ではシェアポイントを使えませんでした。
申し訳ありません。
コメント失礼します。
Sub 履歴付き保存() でファイル名を「指定のセルの値_yyyymmdd_hhmmss」としたいのですが、可能でしょうか?
可能な場合、コードを教えていただけると助かります。
お手数をおかけしますが宜しくお願い致します。
>たさん
可能だと思います。次の通り修正してみてください。なお実機で試していません。注意してください。
oldfn = ActiveWorkbook.FullName
this_value = Sheets(“シート名”).Range(“A1”) ‘ ここに追加。
pos = InStrRev(oldfn, “.”)
newfn = this_value _ ‘ ここを修正。
& Format(Now(), datetime) _
& Right(oldfn, Len(oldfn) – pos + 1)
ご確認ありがとうございます。
ファイル名を変更して保存することが出来ました。
ただ元のファイルに別名で保存されなくなってしまったのですが、原因は分かりますか?
原本の名前が変わるようになっています。
>たさん
意図している挙動は次の通りです。私の環境ではこのように動きました。
test.xlsxを編集。A1セルに「xxxx」と書かれている。
マクロを実行。
test.xlsxが上書き保存される。
test.xlsxがxxxx_20230225_111946.xlsxという名前で保存される。
test.xlsxが開く。
ご確認ありがとうございました。
非常に助かりました。