ExcelVBAのFileCopyでエラーが出た場合はCopyFileを使うと良い

Excel
この記事は約5分で読めます。

ExcelVBAでファイルをコピーする処理に、[FileCopy]を使用すると、実行時に以下のようなエラーが出る場合があります。

 

コピー対象のファイルを開いたまま[FileCopy]が実行されると、このようなエラーが出力され、処理が中断してしまいます。

 

私も、結構長めの処理を実行している途中でこのエラーが出ると、また実行しなおし・・・なんて場面が何回もありました。

この時は、[FileCopy]でコピー対象ファイルを開いたままコピーするとエラーが出るなんて知らなかったので、原因がわからず困っていました。

 

今回は、実際の使用例とともに「FileCopyでエラーが出た場合はCopyFileを使うと良い」ということをお伝えします。

 

 

 意外と見落としがちな対象ファイル開きっぱなし問題

実際コピー対象ファイルを開きっぱなしにしていることはよくあります。例えば、

・毎日バックアップとして使用頻度が高いファイルをコピーする場合、実行時にちょうどコピー対象ファイルの編集中だった

・タスクスケジューラで自動実行していたりすると、うっかりその時間にファイルを開いたままにしていたりなど。
※タスクスケジューラでVBA自動実行するにはPowerShellを介してします↓
PowerShellをタスクスケジューラから実行する
https://devoevo.com/powershell-task/

利用者側にコピー対象ファイルの起動状況を意識させないためにも、コピー時にエラーが出ないようにしたいです。 

 

 

 FileCopyを使用して実際にエラーを出してみる

実際に[FileCopy]を使用して、エラーを出してみます。まずは正常動作から確認してみます。

デスクトップにExcel(FileCopyテスト.xlsm)を新規作成し、同じくデスクトップにコピー対象のファイル(コピーファイル.docx)を作成します。

作成したExcelを開き、VisualBasicEditorを表示させます。[挿入]メニューで標準モジュールを追加し、エディター内にコードを記述します。

VisualBasicEditorについて詳しくはこちらにあります↓

VBAとは?マクロとの違いやVBA初期導入まで

VBAとは?マクロとの違いやVBA初期導入まで
VBA(Visual Basic for Applications)は、ExcelやWord、Accessといった、Microsoft Officeで使用するプログラミング言語です。 VBAはExcel内のデータ集計や、分析、SUMやAVE...

 

ファイルをコピーする[FileCopy]を使用したコードは以下です。

Sub コピーテスト()

    'FileCopy使用

    FileCopy "C:\Users\○○○○\Desktop\コピーファイル.docx", "C:\Users\○○○○\Desktop\コピーファイルのコピー.docx"

End Sub

 

[FileCopy]は以下のように記述します。コピー先に同名ファイルが存在する場合は上書きされます。

FileCopy コピー元ファイルパス, コピー先ファイルパス

 

F5キーを押し、上記のプロシージャを実行します。

ファイルが正常にコピーされました。

次にエラーを表示させる方法として、コピー対象ファイルを開いたまま上記プロシージャを実行します。エラーが(無事?)出ました。

プロシージャとは、処理のまとまりのことです。(SubEnd Subなど)

 

[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なら全然いいと思います。エラーが起こる可能性があることに気を付けて使用してくださいね。