プロが教える店舗&オフィスのセキュリティ対策術

エクセルで一定時間ごとにバックアップを保存するマクロを作りたいです。

ほかのサイトを参考に書いてみたのが、下の文です。
(※1)でバックアップファイルに保存してから、
(※2)で元のファイル名に戻すという仕組みなのですが、
これだと、「元ファイルバックアップ.xlsm」と「元ファイル.xlsm」が
両方とも15分ごとに保存されてしまいます。

試しに(※2)を削除すると、今度は15分ごとに
「元ファイルバックアップ.xlsm」「元ファイルバックアップバックアップ.xlsm」
「元ファイルバックアップバックアップバックアップ.xlsm」と、どんどんバックアップという名前が後についたファイルになってしまいます。

元ファイルの方は、自動保存せずに、作業が終わった段階で初めて保存したいです。
別名でバックアップファイルを保存しながらも、
元のファイルは保存せずに作業をし続けられるような書き換えができないでしょうか?
教えてくださると助かります。


Private Sub Workbook_Open()
MsgBox ("15分ごとに自動保存します")
Call AutoSave
End Sub

Sub AutoSave()
sFileNameHeader = GetFNameFromFStr(ThisWorkbook.FullName)
sTime = Replace(Time(), ":", "")
sSaveFileName = sFileNameHeader & "バックアップ.xlsm"

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=sSaveFileName ' (※1)
ActiveWorkbook.SaveAs Filename:=(sFileNameHeader & ".xlsm") ' (※2)
Application.DisplayAlerts = True

'15分後にもう一度同じマクロを実行する設定
Call Application.OnTime(Now() + TimeValue("00:15:00"), "ThisWorkbook.AutoSave")

End Sub

Function GetFNameFromFStr(sFileName As String) As String
Dim sFileStr As String
Dim lFindPoint As Long
Dim lStrLen As Long

質問者からの補足コメント

  • 補足します。使っているのはエクセル2013、ついでにOSはWindows8.1です。
    エクセル本来のバックアップ機能とは別になんでわざわざマクロを使ってまでバックファイルを作りたいかといいますと、そのエクセルはパソコンがあまり得意でない人にも操作してもらうからです。
    間違って×ボタンを押してしまっても、その日に入力データが全部消えることがないように、自動的にバックアップデータを残すようにしたいのです。
    (なので、×ボタンを押すと消えてしまう本来のバックアップではカバーできません。
    また、バックアップファイルを削除する設定もできません。)

      補足日時:2015/07/31 07:54

A 回答 (3件)

こんにちは。


#2の回答者です。

前に勤めていた時のお話をします。私は、仕事では、Excelなどは使ってきていませんでしたが、パソコンの不得意な「おじちゃん」「おばちゃん」たちも使うことがあって、

「間違って×ボタンを押してしまっても、その日に入力データが全部消えることがないように、自動的にバックアップデータを残すようにしたいのです。」

これは、頭の痛い問題でした。

そこで、私が考えた手段は、初めと終わりのバックアップを取るというプログラムを考えました。終了時までのものと、起動時の時のものです。しかし、今のExcelのシステムでは、常にバックアップは取れるはずです。

私の考えたシステムは、最悪、昨日の終了日まで戻れるということです。もし、そうなら、#2で紹介した方法で、プログラムがある程度分かる人なら、可能なはずです。当然ですが、"SaveAs "は賛成しかねます。

私の時代の頃は、Excelなどのアプリケーションを起動するまでは、安全なファイルだったという想定の元に作られたプログラムだということです。

また、#2の世代別バックアップというのは、開発者などが使うもので、まったく話が違うと思います。私は、てっきり、そちらの話だと思いました。しかし、それとは大幅に違い、端に利用上の問題のようです。

「(なので、×ボタンを押すと消えてしまう本来のバックアップではカバーできません。また、バックアップファイルを削除する設定もできません。)」

私は、それをそのままにするとも、システムのままにするなんていう話を書いたつもりはありません。それに、保存しなくても、正常終了したものに、何か問題もあるのでしょうか?自動的にバックアップは残っています。また、正常終了した場合に、強制的に保存終了させるイベント・ドリブン型のマクロも組めるはずです。このぐらいはVBAマクロとしては、初歩的な範疇ですから、もし、お聞きなる場合は、あらためて質問を出してください。

今回の話は、ヒントだけですから、もし、#2で触れた話を考えるなら、これ以上は、ご自身で工夫、開発すればよいと思います。現行の状況を考えれば、#2の中の話で十分な情報のはずです。

それ以上は、ある程度の近い線までのプログラミングを見せられなければ、それについてはアドバイスはするつもりはありません。たぶん、そういう話は、望んでいないでしょう。また、ここら辺りに手をつけるのは、それなりのExcel以外でのシェル・プログラミングの経験と自信のある部類の人たちのものですから、そうでなかったら、この辺りの開発は、あまりお勧めするものではありません。
    • good
    • 0
この回答へのお礼

二度にわたる返信ありがとうございます。実際のケースを想像してみましたが、ご指摘の通り、強制保存やバックアップからの復元でカバー可能な範囲かな、と思いました。
 様々な視点からのアドバイスありがとうございました!

お礼日時:2015/08/01 00:15

私自身、昔は、この辺りは研究してみたことがあります。

ただ、それは、Excel2000時代の話であって、当時、自動保存は調子が良くなかったことが理由です。Excel 2007以降では、かなり、この自動バックアップの性能は良くなっていると思うのです。

ところで、お使いのバージョンはいくつですか?それによっても話が大幅に変わるような気がします。

>元ファイルの方は、自動保存せずに、作業が終わった段階で初めて保存したいです。
>別名でバックアップファイルを保存しながらも、
>元のファイルは保存せずに作業をし続けられるような書き換えができないでしょうか?

掲示板で出されたコードと、実際のご要望とはかなり違っているようですが、要するに、ご希望になっているのは、Excelで、「世代別バックアップ」をしたいということではありませんか?

私自身は、Office 全体を通してマクロ中心ですから、マクロコードの自動保存というツールも、Microsoft のVSS(Visual SourceSafe)というのも使ったことがあるのですが、どうしようもないゴミ・コードも収録するので、やめてしまいました。専ら、テキストエディタにコピーするという、極めて初歩的な方法ですし、それを検索するには、GrepWin という極めてすぐれものツール(日本語非対応ですが、直してしまいました)を使って、正規表現でファイルを探すという、なんとも奇妙な方法に落ち着いています。

しかし、そうしたアプリを使わずとも、Excel自身の機能を使えば、可能なはずです。(申し訳ないのですが、正直なところ、私は、今のところ、それをマクロにしてまで、手をつける気持ちがありません。調べる手段に、結構細かい作業になるからですが。)

C:\Users\[YourName]\AppData\Roaming\Microsoft\Excel\ [添付画像を付けました(ファイル名透けて見えてしまいます。今年の1月の「教えて!goo」の改変以降、新しい方法を少しずつ開発中です。)]私は、Excel2010 ですが、上記の自動保存フォルダーに、バックアップファイルが、xlsb (バイナリー)ファイルとして残っています。それを利用すればよいとは思います。これは、不要になれば、消えてしまいます。

ただし、それ自体は、Office のシステムの問題ですので、ことさら、現在は手を付けたことがありません。これを利用すればよいと思っています。そのファイルを外部オブジェクト(つまり、File System Object)で、コピー兼リネームにして、適当の場所に保存すればよいのではないかと思います。Excelの内部コマンドは、この場合は使わないほうがよいです。

 ActiveWorkbook.SaveAs
とすれば、保存ファイルは実体化してしまいますから、元のファイルは保存していると同じことです。
こんな場合は、クラス・インスタンスで、「上書きモドキ」を作ってやればいいでしょうね。上書きをしているようで、別名で保存してしまうという方法です。こんな面倒なものとは思いませんでしたので、成功はしていません。

>ActiveWorkbook.SaveAs Filename:=sSaveFileName ' (※1)
>ActiveWorkbook.SaveAs Filename:=(sFileNameHeader & ".xlsm") ' (※2)

>ほかのサイトを参考に書いてみたのが、下の文です。
>(※1)でバックアップファイルに保存してから、
>(※2)で元のファイル名に戻すという仕組みなのですが、

そのコードは、古い書き方で、昔はそれで良かったけれども、今は、ミスすることが多いです。

これらの問題は、特にマクロのテクニックだけのことです。元ファイルのベース名を確保して、それをループしてポストフィックスやプレフィックスをつければ済みます。

http://vba-geek.jp/blog-entry-304.html
これは、私の「上書きモドキ」と同じようなものだと思います。ただし、私の考えた「上書きモドキ」とは作り方が違います。ですが、このコード見て、このマクロの本質的な欠陥を見抜けないようなら、こうしたマクロには手を出さないほうが良いかもしれませんね。(むろん、やったことがある人に限るかもしれませんが(^^;)

私は、ここらあたりは、もう一度は調べてもよいとは思うのですが、「世代別バックアップ」することを目的としたアプリもあるようですから、もし本当に困れば、そこに逃げる手もあるのです。
http://freesoft-100.com/pasokon/backup.html

とりとめもなく書いて、すみません。
「エクセルで一定時間ごとにバックアップを保」の回答画像2
    • good
    • 0

バックアップを作成するための一時ファイルをそのままにしているのか。


行儀の悪いつくりだな。
一時ファイルは必要なくなったら削除しておこう。(削除するマクロを追加ってこと。)
    • good
    • 0
この回答へのお礼

返信ありがとうございます!
ファイルが閉じてしまっても見れる必要があるので、削除することはできないのです。
その仕様でどうにかできないでしょうか。。

お礼日時:2015/07/31 07:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!