No.004
データベースを開いている状態で自分自身をバックアップする 《FileSystemObject》
2003/2007/2010/2013
データベースはとても繊細で、通常操作を行っていると思っていても壊れることがあります。
頻度の高いデータベースにとって、データベース(ファイル)をバックアップすることはとても重要です。
バックアップは、データベースのデータ元であるテーブルをエクスポートすることも有効ですが、動作などをあれこれと構築している場合は、データベース ファイル自体をコピーしておくと、いざというときにまるごと差し替えられるので楽です。
しかしコピーするという作業はすぐにできるものの、意外に忘れてしまうものです。
そこで、データベースを開いている状態で、ボタンなどから、またはタイミングで自動に保存できるように、VBA の記述サンプルを、以下にご案内します。
今回は、開いているデータベース自分自身を、同じ場所に、元のファイル名に「_6桁日付」を加えてコピーする(バックアップ ファイルを作る)ようにします。
同じ日に実行すると同じファイル名となりますので、その際は上書きするかどうかのメッセージを出します。
なお、データベースの拡張子は「.accdb」としています。
Sub Sample()
Dim strNameMoto As String
Dim strNameCopy As String
Dim strPath As String
Dim intMsg As Integer
strPath = CurrentProject.Path & "¥" '現在のDBの場所
strNameMoto = CurrentProject.Name '現在のDBのファイル名
strNameCopy = Left(strNameMoto, Len(strNameMoto) - 6) & "_" & Format(Now, "yymmdd") & ".accdb" 'コピーするDBのファイル名を作成
With CreateObject("Scripting.FileSystemObject")
'同じファイルがあるかどうかを調べ、上書きするかを尋ねる
If .FileExists(strPath & strNameCopy) Then
intMsg = MsgBox("上書きしますか?", vbYesNo)
End If
'バックアップ作成
If intMsg = vbNo Then
MsgBox "キャンセルしました"
Exit Sub
Else
.CopyFile strPath & strNameMoto, strPath & strNameCopy, True
MsgBox "バックアップ完了!"
End If
End With
End Sub
記述前半、データベース自身のパスやファイル名などを取得するために、Applicationオブジェクトの CurrentProjectオブジェクト を使用しています。
Application.CurrentProject.Path で、「D:¥test」のような、ドライブからのフルパス、フォルダ名までを取得します。
CurrentProject.Name で拡張子までのファイル名、
CurrentProject.FullName でフルパスから拡張子までのファイル名
を取得できます。
「Application.」は、上記サンプルのように省略できます。
記述後半の FileSystemObjectオブジェクト については簡単な解説を、下記ヘルプmemoでご参照ください。
ヘルプmemo
<FileSystemObjectオブジェクト>
コンピューターのファイル システムへのアクセスを提供します。
構文: Scripting.FileSystemObject
ヒント:
FileSystemObjectオブジェクトを使用するには、 CreateObjectメソッドを実行し、FileSystemObjectオブジェクトのインスタンスを作成します。
そのインスタンスにメソッドを実行することで、ファイル操作などを実現することができます。
今回、FileExistsメソッド でファイルの存在を調べ、CopyFileメソッド でファイルをコピーしています。
CopyFileメソッド の引数は、最初にコピー元ファイル名、次にコピー先ファイル名を指定、最後の True は上書きするかどうかです。
True は上書き、規定値ですので省略してもかまいません。
上書きをしない False で設定した場合に同じファイルがあると、エラーとなります。