エクセルVBAでファイルをコピーする方法について説明します。
FileCopyステートメントを使用した方法と、FilesystemObjectを使用した方法をそれぞれ解説しています。
ファイルをコピーする方法(FileCopyステートメント)
FileCopyステートメントを使用してファイルをコピーする方法について説明します。
書き方は下のように書きます。
下のコードでは「ファイルA」という名前のエクセルファイルを同じ階層にコピーして、「ファイルAのコピー」という名前で保存します。
コードが長くなってしまうので変数にコピー元とコピー先のファイルパスを格納してからFileCopyステートメントでは変数を使用してシンプルに書いています。
Dim CopyFromFile As String
Dim CopyToFile As String
'コピー元ファイル名をセット
CopyFromFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルA.xlsx"
'コピー元ファイル先をセット
CopyToFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルAのコピー.xlsx"
'ファイルのコピーを実行
FileCopy CopyFromFile, CopyToFile
▽マクロ実行前
「ファイルA」という名前のエクセルファイルをコピーします。
▽マクロ実行前
「ファイルA」がコピーされ「ファイルAのコピー」という名前のファイルが作成されました。
すでに同じ名前のファイルがある場合、上書き保存確認をする
FileCopyステートメントのコピーでは、すでに同じ名前のファイルがある場合はエラーにならずに無条件に上書き保存がされてしまいます。
常に上書き保存して良い場合は不要ですが、上書き保存したくない場合などは同じ名前のファイルがあるかどうかを先に確認して、ある場合はコピーを実行するか確認メッセージを表示させると便利です。
Sub ファイルコピー()
Dim CopyFromFile As String
Dim CopyToFile As String
'コピー元ファイル名をセット
CopyFromFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルA.xlsx"
'コピー先ファイル先をセット
CopyToFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルAのコピー.xlsx"
'コピー先ファイルと同じ名前のファイルがすでに存在する場合
If Dir(CopyToFile) <> "" Then
'メッセージボックスで確認
Anser = MsgBox("すでに同名のファイルが存在します。上書きしますか?", vbYesNo)
'いいえの場合は終了する
If Anser = vbNo Then Exit Sub
End If
'ファイルのコピーを実行
FileCopy CopyFromFile, CopyToFile
End Sub
すでに同じ名前のファイルがある状態で上のマクロを実行すると、このようなメッセージボックスが表示されます。
「はい」が選択された場合はコピーを実行して、「いいえ」が選択された場合はコピーを実行せずに終了します。
コピー元ファイルが開かれていた場合のエラー(FileCopyステートメント)
FileCopyステートメントを使用したコピーではコピー元のファイルが開かれていた場合、実行時エラーが表示されます。
FileCopyステートメントが実行できず止まってしまいました。
実行時エラー70:書き込みできません。
FilesystemObjectを使用したコピー方法(ファイルが開かれていてもOK)
ファイルが開かれていた場合、エラーにならないようにするには、エラー回避(GotoError)を入れる方法などもありますが、FileCopyステートメントを使わず、FilesystemObjectを使用したコピー方法に変更することでも回避できます。
この方法の場合はコピー元ファイルが開かれている場合でも問題なくコピーが実行できます。
Dim CopyFromFile As String
Dim CopyToFile As String
'コピー元ファイル名をセット
CopyFromFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルA.xlsx"
'コピー先ファイル先をセット
CopyToFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルAのコピー.xlsx"
'オブジェクトの作成
Set objFso = CreateObject("Scripting.FilesystemObject")
'コピー実行
objFso.Copyfile CopyFromFile, CopyToFile
'オブジェクトの解放
Set objFso = Nothing
FilesystemObjectを使用した場合も上書き保存は強制的にされますので、上書き保存をしたくない場合はコピー実行前に確認メッセージなどの対策が必要です。
Dim CopyFromFile As String
Dim CopyToFile As String
'コピー元ファイル名をセット
CopyFromFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルA.xlsx"
'コピー先ファイル先をセット
CopyToFile = "C:\Users\Owner\Desktop\learningpgm\VBA\ファイルのコピー\ファイルAのコピー.xlsx"
'コピー先ファイルと同じ名前のファイルがすでに存在する場合
If Dir(CopyToFile) <> "" Then
'メッセージボックスで確認
Anser = MsgBox("すでに同名のファイルが存在します。上書きしますか?", vbYesNo)
'いいえの場合は終了する
If Anser = vbNo Then Exit Sub
End If
'オブジェクトの作成
Set objFso = CreateObject("Scripting.FilesystemObject")
'コピー実行
objFso.Copyfile CopyFromFile, CopyToFile
'オブジェクトの解放
Set objFso = Nothing
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。