ExcelVBAでファイルをコピーする処理に、[FileCopy]を使用すると、実行時に以下のようなエラーが出る場合があります。
コピー対象のファイルを開いたまま[FileCopy]が実行されると、このようなエラーが出力され、処理が中断してしまいます。
私も、結構長めの処理を実行している途中でこのエラーが出ると、また実行しなおし・・・なんて場面が何回もありました。
この時は、[FileCopy]でコピー対象ファイルを開いたままコピーするとエラーが出るなんて知らなかったので、原因がわからず困っていました。
今回は、実際の使用例とともに「FileCopyでエラーが出た場合はCopyFileを使うと良い」ということをお伝えします。
意外と見落としがちな対象ファイル開きっぱなし問題
実際コピー対象ファイルを開きっぱなしにしていることはよくあります。例えば、
・毎日バックアップとして使用頻度が高いファイルをコピーする場合、実行時にちょうどコピー対象ファイルの編集中だった
・タスクスケジューラで自動実行していたりすると、うっかりその時間にファイルを開いたままにしていたりなど。
※タスクスケジューラでVBA自動実行するにはPowerShellを介してします↓
PowerShellをタスクスケジューラから実行する
https://devoevo.com/powershell-task/
利用者側にコピー対象ファイルの起動状況を意識させないためにも、コピー時にエラーが出ないようにしたいです。
FileCopyを使用して実際にエラーを出してみる
実際に[FileCopy]を使用して、エラーを出してみます。まずは正常動作から確認してみます。
デスクトップにExcel(FileCopyテスト.xlsm)を新規作成し、同じくデスクトップにコピー対象のファイル(コピーファイル.docx)を作成します。
作成したExcelを開き、VisualBasicEditorを表示させます。[挿入]メニューで標準モジュールを追加し、エディター内にコードを記述します。
VisualBasicEditorについて詳しくはこちらにあります↓

ファイルをコピーする[FileCopy]を使用したコードは以下です。
Sub コピーテスト()
'FileCopy使用
FileCopy "C:\Users\○○○○\Desktop\コピーファイル.docx", "C:\Users\○○○○\Desktop\コピーファイルのコピー.docx"
End Sub
[FileCopy]は以下のように記述します。コピー先に同名ファイルが存在する場合は上書きされます。
FileCopy コピー元ファイルパス, コピー先ファイルパス
F5キーを押し、上記のプロシージャを実行します。
ファイルが正常にコピーされました。
次にエラーを表示させる方法として、コピー対象ファイルを開いたまま上記プロシージャを実行します。エラーが(無事?)出ました。
[FileCopy]について概要はこちらです↓
FileCopy ステートメント (VBA) | Microsoft Learn
FileCopyの代わりにCopyFile使用する
[FileCopy]で上記のようなエラーが出る場合は、同じコピー処理ができる[CopyFile]を使うことで解決します。
Dim FSO As New FileSystemObject
FSO.CopyFile コピー元ファイルパス, コピー先ファイルパス
[CopyFile]について概要はこちら↓
CopyFile メソッド (Visual Basic for Applications) | Microsoft Learn
[CopyFile]を使用した例です。
最初に[CopyFile]を使用するための参照設定を行います。[ツール]メニューの[参照設定]をクリックします。
[Microsoft Scripthing Runtime]にチェックを入れてOKを押します。
[CopyFile]を使用したコードは以下のようになります。
Sub コピーテスト()
'CopyFile使用
Dim FSO As New FileSystemObject
FSO.CopyFile "C:\Users\○○○○\Desktop\コピーファイル.docx", "C:\Users\○○○○\Desktop\コピーファイルのコピー.docx"
End Sub
実行すると、[FileCopy]と同じようにコピーができることが確認できます。
コピー対象ファイルを開いたままで実行しても、エラーが出ずコピーができます。
[FileCopy]と同じように、コピー先に同名ファイルが存在している場合は、上書き保存されます。
ただし、第三引数に[OverWriteFiles:= False]とすることで、同名ファイルがあった場合はコピーしないようにすることが可能です。
FSO.CopyFile コピー元ファイルパス, コピー先ファイルパス, OverWriteFiles:= False
同名ファイルがあった場合には、メッセージが表示されます。
どちらを使えばいいか?
参照設定やオブジェクト作成コードの記述が必要ですが、使い勝手を考えると[CopyFile]を使用した方が良いです。
ですが分かっていながらも、つい記述が簡単な[FileCopy]を使用してしまいますけどね・・・
自分だけが使う小規模でエラー原因がすぐにわかるようなVBAなら全然いいと思います。エラーが起こる可能性があることに気を付けて使用してくださいね。