« ReplaceメソッドとReplace関数 | トップページ | マクロをショートカットキーに割り当てる »

2011年5月14日 (土)

バックアップいろいろ

いろいろなタイミングでのバックアップについて。
ここではバックアップというのは
ファイルの複製をコピーする
ということを指します。

ファイル保存時のバックアップは以前の記事で書きました。
ファイル保存時に自動でコピーを作って保存

上の記事の補足ですが、
この「保存時」とは手動で保存したときのみです。
記事を書いたときはVBAで保存したときも
イベントが発動すると思っていましたが
違っていました。

VBAで保存したときは、
Workbook_BeforeSaveは発動しません。

他にはどんなタイミングが考えられるかリストアップします。

一定時間ごとにバックアップを保存
ブックを閉じるときにバックアップを保存

いろいろなんて言っておいて
2つしか挙げられないので、
バリエーションで誤魔化します。

1. ○○分ごとにバックアップを作成する
2. ○○分ごとにバックアップを上書き保存する
3. ○○分ごとに本体を保存して、バックアップも作成する
4. ○○分ごとに本体を保存して、バックアップも上書き保存する
5. ブックを閉じるときにバックアップを作成する
6. ブックを閉じるときにバックアップを上書き保存する

以上についてやっていきます。

1. ○○分ごとにバックアップを作成する

○○分ごとといえば
OnTimeです。

コードはこちら

○○分ごとにバックアップを作成するコード:

Sub macro110514a()
'1. ○○分ごとにバックアップを作成する

    '本体保存
'    ActiveWorkbook.Save

    Dim wb As String
    '基本の名前をActiveWorkbookの拡張子を除いたものにする
    wb = Replace(ActiveWorkbook.Name, ".xls", "")
    'コ ピーを保存
    ActiveWorkbook.SaveCopyAs _
        ActiveWorkbook.Path & "\" & wb & _
        Format(Now(), "yyyymmdd_hhmmss") & ".xls"
   
    '30分後にこのプロシージャを実行
    '間隔はTimeValue関数内を 変更
    Application.OnTime _
        Now() + TimeValue ("00:30:00"), _
        "macro110514a"

End Sub

このコードは最初の一回を実行しないと
繰り返し実行しないので
ブックを開いたら自分で最初の一回を実行してください。

それも自動でするなら
Workbook_Openイベントを利用します。

ワークブックのオブジェクトモジュールの
イベントの利用方法についても上のリンクの記事を参照してください。

コードはこちら

Workbook_Openイベントを利用して始動するコード:

Private Sub Workbook_Open()

    Dim flag As Integer
    flag = MsgBox("自動バックアップ実行しますか?", _
         vbYesNo, "タイトル")
       
    If flag = 6 Then
        Application.OnTime _
             Now() + TimeValue("00:30:00"), _
             "macro110514a"
    End If
   
End Sub

OnTimeで設定したプロシージャは、
ブックを閉じただけで、Excelが立ち上がっている状態では
設定した時間になると
ブックを閉じていてもブックを開いて実行しようとします。

OnTimeで設定したものをなくしたいときは、
Excel自体を閉じてください。

2. ○○分ごとにバックアップを上書き保存する

これはバックアップを毎回作成していくのではなく、
バックアップのファイルを1つだけ作成して、
次からは上書き保存していきます。

SaveCopyAsメソッドは、
既存の同名ファイルがあっても
エラーや警告になることなく上書き保存されます。

既存の同名ファイルがなければ作成されます。

コードはこちら

○○分ごとにバックアップを上書き保存するコード:

Sub macro110514b()
'2. ○○分ごとにバックアップを上書き保存する

    '本体保存
'    ActiveWorkbook.Save
   
    Dim wb As String
    '基本の名前をActiveWorkbookの拡張子を除いたものにする
    wb = Replace(ActiveWorkbook.Name, ".xls", "") & "BackUp"
    'コピーを保存
    ActiveWorkbook.SaveCopyAs _
        ActiveWorkbook.Path & "\" & wb & ".xls"
   
    '30分後にこのプロシージャを実行
    '間隔はTimeValue関数内を変更
    Application.OnTime _
        Now() + TimeValue("00:30:00"), _
        "macro110514b"

End Sub

3. ○○分ごとに本体を保存して、バックアップも作成する

1番のコードに
次の本体を保存するコードを追加するだけです。

'本体保存
ActiveWorkbook.Save

1番のコードにコメントブロックしてありますので
シングルクォーテーションをはずしてください。

4. ○○分ごとに本体を保存して、バックアップも上書き保存する

2番のコードに本体を保存するコードを追加するだけです。
3番と同様にコメントブロックしてあります。

5. ブックを閉じるときにバックアップを作成する

Workbook_BeforeCloseイベントを使用します。

コードはこちら

ブックを閉じるときにバックアップを作成するコード:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'5. ブックを閉じるときにバックアップを 作成する

    Dim wb As String
    '基本の名前を ActiveWorkbookの拡張子を除いたものにする
    wb = Replace(ActiveWorkbook.Name, ".xls", "")
    'コピーを保存
    ActiveWorkbook.SaveCopyAs _
        ActiveWorkbook.Path & " \" & wb & _
        Format(Now(), "yyyymmdd_hhmmss") & ".xls"

End Sub

6. ブックを閉じるときにバックアップを上書き保存する

こちらも
Workbook_BeforeCloseイベントを使用します。

コードはこちら

ブックを閉じるときにバックアップを上書き保存するコード:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'6. ブックを閉じるときにバックアップを 上書き保存する

    Dim wb As String
    '基本の名前 をActiveWorkbookの拡張子を除いたものにする
    wb = Replace(ActiveWorkbook.Name, ".xls", "") & "BackUp"
    'コピーを保存
    ActiveWorkbook.SaveCopyAs _
        ActiveWorkbook.Path & "\" & wb & ".xls"
       
End Sub

同じコードを何回も使ってしまいました。

似たようなことをしていると
同じコードを何回も使用していることが多くなります。

そうなったときは、
独立したプロシージャを作ったほうが
コードの入力は楽です。

Callステートメントで呼び出せば省力できます。

|

« ReplaceメソッドとReplace関数 | トップページ | マクロをショートカットキーに割り当てる »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: バックアップいろいろ:

« ReplaceメソッドとReplace関数 | トップページ | マクロをショートカットキーに割り当てる »