この記事では、自分自身のAccessのデータベースファイルを複製(コピー)する方法についてご説明します。
今回のコードを実装することで、ちょっとしたバックアップ機能として使うことができるので便利です。
【動画】自分自身のAccessのデータベースファイルを複製(コピー)する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
FSO(FileSystemObjectオブジェクト)のCopyFileメソッドを使い、自分自身のAccessのデータベースファイルを指定の場所に複製(コピー)しています。
今回はコピーしたファイル名に、Now関数を使って取得した現在のシステム日付や時刻を、年月日時分秒の形でファイル名に使用しています。
コード作成の流れ
このインスタンス化処理をしないと、自分のExcelファイルを複製(コピー)するCopyFileメソッドを使うことができないので必ず実行します。
コードの例
Option Compare Database Private Sub btn_bk_Click() Dim fso As Object 'FileSystemObjectのインスタンス用変数 Dim datetimeStr As String '年月日時分秒を取得する変数 Dim db As Object 'DAOデータベース用オブジェクト用変数 Dim copyFileNM As String 'コピー先のファイル名 '年月日時分秒を取得する datetimeStr = Format(Now, "yyyymmddhhnnss") '自分自身のデータベースを開く Set db = CurrentDb 'FileSystemObjectのインスタンスを生成する Set fso = CreateObject("Scripting.FileSystemObject") 'コピーしたファイルの名前を生成する copyFileNM = Replace(db.Name, "." & fso.GetExtensionName(db.Name), "") & _ "_" & _ datetimeStr & "." & fso.GetExtensionName(db.Name) 'ファイルのコピーする fso.CopyFile db.Name, copyFileNM 'コピーしたファイルのフォルダを開く(コピーしたファイルは選択状態にする) Call Shell("explorer.exe /select," & copyFileNM, vbNormalFocus) End Sub
注目すべきコード①
最初に見て頂きたいのは11行目です。
'Now関数を使って取得した現在のシステム日付や時刻を、年月日時分秒の形で取得する datetimeStr = Format(Now, "yyyymmddhhnnss")
以上のコードは、Now関数から日付と時刻を「年月日時分秒」の形で取得するコードです。
例えば、以上のコードが実行されたのが2023年9月16日の9時34分39秒の場合は20230916093439が取得されます。
なお、この日付と時刻を取得する処理は主題のテーマであるファイルのコピーの処理とは逸れるので必須ではないですが、コピーしたファイルの名前に日付と時刻を付けた方がいつコピーしたのかが分かりやすくするために今回取り入れてみました。(そもそもファイルの作成日でいつコピーされたか分かりますが)
ちなみにコピーされたファイルには、以下のようにファイル名にこの日付と時刻の値が付けられます。
注目すべきコード②
最初に見て頂きたいのは14行目です。
'自分自身のデータベースを開く Set db = CurrentDb
以上のコードは、Accessのデータベースファイルを開き、Accessのデータベースの操作を行うのに必要なインスタンスを生成する処理のコードです。
生成されたインスタンスは、自分自身のAccessのデータベースファイルの名前を取得するのに使います。(Nameプロパティ)
注目すべきコード③
最初に見て頂きたいのは17行目です。
'FileSystemObjectのインスタンスを生成する Set fso = CreateObject("Scripting.FileSystemObject")
以上のコードは、AccessのデータベースファイルをコピーするCopyFileメソッド、および拡張子を取得するGetExtensionNameメソッドを実行するために必要なFileSystemObjectのインスタンス化処理を実行するコードです。
FileSystemObjectのインスタンス化処理を実行しないとCopyFileメソッドとGetExtensionNameメソッドを実行することができないので必ずこのコードを実行します。(実行しないとエラーになります)
注目すべきコード④
次に見て頂きたいのは20行目から22行目です。
'コピーしたファイルの名前を生成する copyFileNM = Replace(db.Name, "." & fso.GetExtensionName(db.Name), "") & _ "_" & _ datetimeStr & "." & fso.GetExtensionName(db.Name)
以上のコードは、Accessのデータベースファイルのコピー先のファイル名を取得するコードです。
今回のサンプルでは以下の「C:¥work¥10_勉強¥10_VBA関連¥Access¥0002」の配下にある「0002.mdb」というAccessのデータベースファイルを複製(コピー)します。
Accessのデータベースファイルを複製(コピー)する前に、どんな名前を付けるかをここで決めておきます。
コピー先のファイル名は下のイメージです。
db.Nameは、コピー元のAccessのデータベースファイル名をフルパスを返すので、Replace関数で、「.」と拡張子を削除します。(今回は「.mdb」の文字列を削除)
「.mdb」の文字列が削除されたので「C:¥work¥10_勉強¥10_VBA関連¥Access¥0002¥0002」となります。
末尾の「0002」に、「_」と「年月日時分秒」、「.」と拡張子を結合させて「C:¥work¥10_勉強¥10_VBA関連¥Access¥0002¥0002¥0002_20230916093439.mdb」とし、変数copyFileNMに格納します。
以上でコピー先のファイル名が決まりました。
注目すべきコード⑤
次に見て頂きたいのは25行目から28行目です。
'ファイルのコピーする fso.CopyFile db.Name, copyFileNM 'コピーしたファイルのフォルダを開く(コピーしたファイルは選択状態にする) Call Shell("explorer.exe /select," & copyFileNM, vbNormalFocus)
コードの説明
以上のコードは、自分自身のAccessのデータベースファイルを複製(コピー)してコピーしたファイルのフォルダを開くコードです。
ファイルの複製(コピー)はCopyFileメソッドを使います。
CopyFileメソッドを使ってファイルの複製(コピー)する場合は、CopyFileメソッドの第1引数には自分自身のAccessのデータベースファイルをフルパスを、第2引数はコピー先のAccessのデータベースファイルをフルパス(「注目すべきコード④」でファイル名を生成)を指定します。
ファイルの複製(コピー)が終わったら、コピーしたファイルのフォルダを開きます。
コピーしたファイルのフォルダを開くにはShell関数で「explorer.exe」を引数に指定して実行するのですが、オプションの「 /select」を指定することでコピーしたファイルを選択状態にすることができます。
ファイルが選択された状態とは以下の画像の通りです。
動作確認
コード実行前
今回はAccessのデータベースファイルを用意しました。
テーブルとフォームがいくつも存在しています。
自分自身のAccessのデータベースファイルを複製(コピー)するのにフォーム「frm_work」にある「実行」ボタンをクリックすることで処理が実行されます。
コード実行後
コードを実行すると、自分自身のAccessのデータベースファイルを複製(コピー)されて、複製されたファイルのフォルダが開いて選択状態になっていることが確認できました。
最後に
この記事では、自分自身のAccessのデータベースファイルを複製(コピー)する方法についてご説明しました。
ちょっとしたバックアップ機能として自分自身のファイルをコピーしておきたいときに便利なので、参考に頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。