この記事では、自分自身のExcelのファイルを複製(コピー)する方法についてご説明します。
今回のマクロを実装することで、ちょっとしたバックアップ機能として使うことができるので便利です。
【動画】自分自身のExcelのファイルを複製(コピー)する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
FSO(FileSystemObjectオブジェクト)のCopyFileメソッドを使い、自分自身のExcelのファイルを指定の場所に複製(コピー)しています。
今回はコピーしたファイル名に、Now関数を使って取得した現在のシステム日付や時刻を、年月日時分秒の形でファイル名に使用しています。
マクロ作成の流れ
このインスタンス化処理をしないと、自分のExcelファイルを複製(コピー)するCopyFileメソッドを使うことができないので必ず実行します。
コードの例
Excelのマクロのコード(例)
Option Explicit Sub filecopyFunc() Dim fso As FileSystemObject 'FileSystemObjectのインスタンス用変数 Dim datetimeStr As String '年月日時分秒を取得する変数 'FileSystemObjectのインスタンス化 Set fso = CreateObject("Scripting.FileSystemObject") 'Now関数を使って取得した現在のシステム日付や時刻を、年月日時分秒の形で取得する datetimeStr = Format(Now, "yyyymmddhhnnss") 'CopyFileメソッドで自分のExcelファイルを、ファイル名に「年月日時分秒」を結合させてコピーする fso.CopyFile ThisWorkbook.FullName, _ ThisWorkbook.Path & "\" & _ Replace(ThisWorkbook.Name, _ "." & fso.GetExtensionName(ThisWorkbook.FullName), _ "") & _ "_" & datetimeStr & "." & fso.GetExtensionName(ThisWorkbook.FullName) End Sub
コードの解説
注目すべきコード①
最初に見て頂きたいのは9行目です。
'FileSystemObjectのインスタンス化 Set fso = CreateObject("Scripting.FileSystemObject")
以上のコードは、ExcelのファイルをコピーするCopyFileメソッドを実行するために必要なFileSystemObjectのインスタンス化処理を実行するコードです。
FileSystemObjectのインスタンス化処理を実行しないとCopyFileメソッドを実行することができないので必ずこのコードを実行します。(実行しないとエラーになります)
注目すべきコード②
次に見て頂きたいのは12行目です。
'Now関数を使って取得した現在のシステム日付や時刻を、年月日時分秒の形で取得する datetimeStr = Format(Now, "yyyymmddhhnnss")
以上のコードは、Now関数から日付と時刻を「年月日時分秒」の形で取得するコードです。
例えば、以上のコードが実行されたのが2022年9月18日の10時3分18秒の場合は20220918100318が取得されます。
なお、この日付と時刻を取得する処理は主題のテーマであるファイルのコピーの処理とは逸れるので必須ではないですが、コピーしたファイルの名前に日付と時刻を付けた方がいつコピーしたのかが分かりやすくするために今回取り入れてみました。(そもそもファイルの作成日でいつコピーされたか分かりますが)
注目すべきコード③
次に見て頂きたいのは12行目から17行目です。
'CopyFileメソッドで自分のExcelファイルを、ファイル名に「年月日時分秒」を結合させてコピーする fso.CopyFile ThisWorkbook.FullName, _ ThisWorkbook.Path & "\" & _ Replace(ThisWorkbook.Name, _ "." & fso.GetExtensionName(ThisWorkbook.FullName), _ "") & _ "_" & datetimeStr & "." & fso.GetExtensionName(ThisWorkbook.FullName)
以上のコードは、自分自身のExcelのファイルを複製(コピー)する処理のコードです。
複製(コピー)するにはCopyFileメソッドを使います。
使い方は、CopyFileメソッドの引数(2つ)に、コピーするファイルをフルパスと、コピー後のファイルのフルパスを指定します。
例えば、本記事で紹介した動画で言うと、フォルダ「C:\work\10_勉強\10_VBA関連\0163」の配下にある「0163.xlsm」を複製(コピー)する場合は次の通り(例)になります。
「C:¥work¥10_勉強¥10_VBA関連¥0163¥0163.xlsm」
「C:¥work¥10_勉強¥10_VBA関連¥0163¥0163_20220917171701.xlsm」
1つ目の引数に指定するファイル名と2つ目の引数に指定するファイル名はフルパスで記述します。
ちなみに、今回は2つ目の引数に指定するコピー後のファイルの名前に「年月日時分秒」の文字列を結合させています。
先ほど説明した注目すべきコード②で取得した「年月日時分秒」をファイル名に付けるので、ファイル名は「C:¥work¥10_勉強¥10_VBA関連¥0163¥0163_20220917171701.xlsm」で複製(コピー)されます。
動作確認
マクロ実行前
フォルダ内にExcelファイルが存在しています。
マクロ実行後
マクロを実行すると自分自身(0163.xlsm)のExcelファイルが複製(コピー)されました。
もしExcelファイルを最新の状態で複製(コピー)しておきたい時は、実行する前にファイルを保存しておいてください。
【注意】参照設定が必要です
一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。
参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。
- Windows Script Host Object Model(wshom.ocx)
なぜ必要かというと、Excelのマクロのコードの15行目の「FileSystemObject」というオブジェクトが「wshom.ocx」というファイルを参照するからです。
Dim fso As FileSystemObject 'FileSystemObjectのインスタンス用変数
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。
最後に
本記事では、自分自身のExcelのファイルを複製(コピー)する方法についてご説明しました。
ちょっとしたバックアップ機能として自分自身のファイルをコピーしておきたいときに便利なので、参考に頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。