即効テクニック |
●概要● 業務で使用する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 インストールに関しての詳細は上記のページをお読み下さい。