HOME > 即効テクニック > AccessVBA > データベース・データ保護 > データベース自動バックアップ関数 (FSO)

即効テクニック

データベース・データ保護

データベース自動バックアップ関数 (FSO)

(Access 97)
●概要●
業務で使用するMDBの場合、定期的なバックアップと修復・最適化はJetエンジンを使っている限り必要不可欠です。
そこで、複数世代のバックアップを自動的に作成する関数を説明します。

●準備●
新規モジュールに以下のプロシージャを記述します。

●サンプルコード●
'【引数説明】
' Generation    バックアップファイルの世代数
' TargetFolder  バックアップするフォルダのパス

Public Function FileBackUp( _
                 Optional Generation As Integer = 1, _
                 Optional TargetFolder As String = "")

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'変数宣言
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    Dim FSO         As Object   'ファイルシステムオブジェクト
    Dim objFol      As Object   'ターゲットフォルダオブジェクト
    Dim objFile     As File     'ターゲットファイルオブジェクト
    Dim strTgtFile  As String   '対象ファイル名
    Dim BakFileType As String   'バックアップファイル拡張子
    Dim BakFileName As String   'バックアップファイル名
    Dim UpdateTime  As Date     'バックアップファイル更新時間
    Dim iFileNum    As Integer  'バックアップファイル数
    Dim DelFileName As String   '削除ファイルネーム

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'初期設定
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

    'エラートラップ
    On Error GoTo err_FsoCopy:

    'FileSystemObjectの作成
    Set FSO = CreateObject("Scripting.FileSystemObject")

    'バックアップの拡張子設定
    BakFileType = ".bak"

    'コピー元として、使用中のMDBのパスを取得
    strTgtFile = CurrentDb.Name

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'ターゲットフォルダの存在チェック
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

    'フォルダが存在しない場合
    If FSO.FolderExists(TargetFolder) = False _
       And TargetFolder <> "" Then

         FSO.CreateFolder (TargetFolder)

    '引数が設定されていない場合
    ElseIf TargetFolder = "" Then

        '引数が無い場合はMDBと同フォルダを設定
        TargetFolder = FSO.GetParentFolderName(strTgtFile)
    End If

    'フォルダオブジェクト作成
    Set objFol = FSO.GetFolder(TargetFolder)

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'世代のチェック
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    'バックアップファイルの数をチェック
    For Each objFile In objFol.Files

      'ファイル名チェック
      If Mid(objFile.Name, 9) = FSO.GetBaseName(strTgtFile) _
                              & BakFileType Then
          iFileNum = iFileNum + 1 'バックアップファイル数
      End If
    Next

    'バックアップがすでに設定数分ある場合の処理
    If iFileNum = Generation Then

        UpdateTime = Now

        For Each objFile In objFol.Files

            'ファイル更新時間のチェック
            If UpdateTime > objFile.DateLastModified _
            And Mid(objFile.Name, 9) = FSO.GetBaseName(strTgtFile) _
                                     & BakFileType Then

                UpdateTime = objFile.DateLastModified
                DelFileName = objFile.Name
            End If
        Next

        '一番古いファイルを削除
        FSO.DeleteFile TargetFolder & "\" & DelFileName
    End If

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'ファイルコピー
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    'ファイル名を設定
    BakFileName = TargetFolder & "\" _
                & Format(Now(), "mmddhhnn") _
                & FSO.GetBaseName(strTgtFile) & BakFileType

    'ファイルのコピー(同名ファイルは上書き)
    FSO.CopyFile strTgtFile, BakFileName, True
    'Beep

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'終了処理
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
err_Exit:
    Set objFile = Nothing
    Set objFol = Nothing
    Set FSO = Nothing
    Exit Function

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'エラー処理
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
err_FsoCopy:
    MsgBox err.Description
    err.Clear
    Resume err_Exit:

End Function

'動作確認用プロシージャ
Private Sub BackUpTest()
    Call FileBackUp(2)
End Sub

●動作確認●
上記プロシージャ「BackUpTest」を実行します。今回は引数TagetFolderに何も指定していないので、使用中のMDBと同じフォルダにバックアップが作成されていることを確認して下さい。
また、このプロシージャを複数回実行し、常に最新の世代(今回は2世代)がバックアップされていることも確認して下さい。
なおバックアップファイルは「mmddhhss + 元MDB名.bak」という形式で保存されます。例えば9月1日の午前10時に「売上管理.mdb」というデータベースのバックアップを行うと、「09011000売上管理.bak」と保存されます。

●詳細●
この関数では、FileSystemObjectを利用して使用中のMDBをコピーし、バックアップを実現しています。他にもフォルダの存在チェックやフォルダ作成、ファイル名の取得やファイルの更新時間の取得など、あらゆる場面でFSOの機能を使用しています。
特に世代のチェックでは、まず存在するバックアップファイルの数を確認し、次にそれらの更新時間を判断することで常に最新のn世代がバックアップとして残るようにしてあります。

この関数をAutoExecマクロを使用して起動時に自動実行させれば、エンドユーザーに操作を意識させることなく定期的なバックアップを実行できるでしょう。

●備考●
このサンプルコードを記述する際には、Microsoft Scripting Runtimeに参照設定しておくことをオススメします。
仮に参照設定していない場合でも正常に動作しますが、記述の際に自動メンバ表示や自動データヒントといったコード補完機能が働きません。
またAccess97以前の場合も、IE4.0以上が導入されており、以下のサイトからダウンロードできる「scr55jp.exe」をインストールすることでこの関数(File System Object)が使用できるようになります。

http://www.microsoft.com/msdownload/vbscript/scripting.asp?id=25

インストールに関しての詳細は上記のページをお読み下さい。