定期的にバックアップを取りたい


MSOfficeを使って作ったファイルを保存せずに終了してしまい、数時間分の作業をやり直すことになった人がいました。
使用しているソフト(PowerPoint)の自動保存は10分置きに保存する設定になっていましたが、特に異常終了したわけではなく、ウィンドウ右上の×ボタンで閉じて保存しますか?というダイアログにはいいえという選択肢をクリックした為に保存されているファイルも消えてしまいました。
このようなことを防ぐために(そもそも保存しろよってのはなしで)VBAやVBSで定期的に保存する仕組みを作ってPCを起動したらダブルクリックしてもらえればPC起動中はOffceのファイルを自動保存してくれるプログラムを作りたいです。
VBAで作ってみたものの、SLEEPで処理待ちをしていると保存できてもExcelが使用できなくなってしまいます。(反応なし)
定期的にバックアップ処理だけを動かしてそれ以外のタイミングはCPUをほぼ使わないというプログラムはできるでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2018/09/25 10:00:06

回答2件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

Application.OnTime を使ってください。

id:Z1000S No.2

回答回数39ベストアンサー獲得回数27

とりあえずExcel限定で。
autoSaveBooksを実行後、こいつを書いてあるBookを閉じないでおけば
エラーがない限りは、条件にあてはまるファイルは保存してくれるかと。
途中で保存処理をキャンセルしたい場合には、cancelAutoSaveを実行して下さい。
イミディエイトウィンドウに出力されるログ以外には、稼働状況を確認する方法はなさそう。

'保存間隔(分)
Private Const INTERVAL_MINUTE   As Long = 5


Private dtNext_     As Date


Public Sub autoSaveBooks()

    Dim wb  As Workbook
    Dim sFileName   As String

    For Each wb In Workbooks
        If wb.Name <> ThisWorkbook.Name Then
            If wb.Path = "" Then
                '未保存なら、ダイアログを表示
                sFileName = Application.GetSaveAsFilename(InitialFileName:=wb.Name & ".xlsx", FileFilter:="Excelファイル, *.xlsx", Title:=wb.Name & " を名前を付けて保存")

                If sFileName <> "False" Then
                    Call wb.SaveAs(sFileName)

                    Debug.Print "Save:" & Format$(Now, "hh:nn:ss") & "[" & wb.Path & "\" & sFileName & "]"
                Else
                    Debug.Print "Skip:" & Format$(Now, "hh:nn:ss") & "[" & wb.Name & "]"
                End If
            ElseIf wb.ReadOnly Then
                '読み取り専用なら保存しない
            ElseIf wb.Saved Then
                '変更がなければ保存しない
            Else
                wb.Save

                Debug.Print "Save:" & Format$(Now, "hh:nn:ss") & "[" & wb.FullName & "]"
            End If
        End If
    Next wb

    dtNext_ = DateAdd("n", INTERVAL_MINUTE, Now)

    Debug.Print "Next:" & Format$(dtNext_, "hh:nn:ss")


On Error GoTo ERR_CANNOT_SAVE
    Call Application.OnTime(EarliestTime:=dtNext_, Procedure:="autoSaveBooks", Schedule:=True)

    Exit Sub

ERR_CANNOT_SAVE:
    Debug.Print Format$(Now, "hh:nn:ss") & ":[" & CStr(Err.Number) & "]" & Err.Description

End Sub

Public Sub cancelAutoSave()

    Call Application.OnTime(EarliestTime:=dtNext_, Procedure:="autoSaveBooks", Schedule:=False)

    Debug.Print "Auto Save Canceled."

End Sub


以下、個人的な意見なので、かる~く読み流して、気に入らなかったら無視して下さい。
誰もが経験の有りそうなことですね。
自慢じゃないですが、私も何回もやったことあります。

こういった自動化は出来るけど、正直あまりおすすめできないと思ってます。
自動的に保存はされるけど、逆に言えば、
本人が意図しない保存をされる可能性も否定できないし、
そこまでコントロールしようとすると、どんどん深みにハマる事になりそうなので・・・

基本的には、作業者がこまめに保存する習慣をつけるべき事だと思います。
キーボードで、Ctrl + Sを押すだけで済むのですから。

id:Z1000S

補足
セルが編集中のBookがあると、そのセルの編集が終わるまで処理が止まって、待ち続けるようです。

2018/09/19 22:31:56

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません