【Excel VBA】ファイルをコピーする(FileCopyステートメント)|Excel VBA |
日々の業務でファイルを複製するときに手動でコピーしていませんか?
VBAのファイルをコピーするための命令であるFileCopyステートメントを使えば、コピー元とコピー先を指定するだけでファイルを一瞬で複製できます。例えば、パソコン内に「レポート.xlsx」というファイルがあり、それと同じものを別のフォルダにも複製したいときなどに使います。ファイルのコピー処理を自動化することで、操作の手間を省き、ヒューマンエラーも防げます。
本記事では、FileCopyステートメントの基本から応用までをわかりやすく解説するとともに、複数のファイルを作成する方法や同名ファイルを上書きしない方法もサンプルコード付きで紹介します。
FileCopyステートメントの構文は次のとおりです。
FileCopy source,destination
コピー元
コピー先
例1:「C:\Users\Documents」フォルダにある「レポート.xlsx」ファイルを「C:\Work」フォルダにコピーします。
Sub Copy1()
FileCopy "C:\Users\Documents\レポート.xlsx","C:\Work\レポート.xlsx"
End Sub
「コピー先」にはフォルダ名ではなく、ファイル名まで指定する点に留意してください。
次のようにコピー先をフォルダだけにするとエラーになります。
Sub Copy1()
FileCopy "C:\Users\Documents\レポート.xlsx","C:\Work"
End Sub
「コピー先」にはファイル名を指定するので、同じフォルダ内にも別名でファイルの複製を作ることができます。
例2:「C:\報告」フォルダにある「売上テンプレート.xlsx」をもとに、同じフォルダに「売上_1月.xlsx」〜「売上_12月.xlsx」のファイルを複製します。
※回数を指定して繰り返すFor〜Nextステートメントを使います。”For i = 1 To 12”でループを12回繰り返して、ループさせた回数を”○月”の月部分に利用します。Sub CopyTemplate1()
Dim i As Long
For i = 1 To 12
FileCopy "C:\報告\売上テンプレート.xlsx","C:\報告\売上_" & i & "月.xlsx"
Next i
End Sub
ファイルを12個複製できました。

コピー元やコピー先のパスには、VBAが書かれているExcelファイルの保存場所を示すThisWorkbook.Pathを組み合わせることもできます。
※パスについての詳細は「【Excel VBA】ファイルのパスについて」を参照してください。
例3:「C:\報告」フォルダの中に、このマクロを実行している「ファイルコピーマクロ.xlsm」と「売上テンプレート.xlsx」、さらに年ごとのフォルダがあります。このうち「2026」フォルダ内に、「売上テンプレート.xlsx」をもとにした「売上_1月.xlsx」〜「売上_12月.xlsx」のファイルを複製します。

Sub CopyTemplate2()
Dim i As Long
For i = 1 To 12
FileCopy "C:\報告\売上テンプレート.xlsx",ThisWorkbook.Path & "\2026\売上_" & i & "月.xlsx"
Next i
End Sub
便利なFileCopyステートメントですが、「コピー先」に同名のファイルが存在している場合、確認メッセージを表示せずにそのファイルを上書きしてしまいます。そのため、ファイルを上書きする前にDir関数を使ってコピー先にファイルが存在するかをチェックします。
例4:「C:\Users\Documents」フォルダにある「レポート.xlsx」ファイルを「C:\Work」フォルダにコピーします。コピー先のフォルダにすでに「レポート.xlsx」が存在する場合は、上書きしてもよいかどうかを確認するメッセージボックスを表示します。一方、コピー先のフォルダに「レポート.xlsx」が無い場合、メッセージボックスを表示せず、そのままコピーを実行します。
Sub CopyDir()
Dim ret As Long
If Dir("C:\Work\レポート.xlsx ") <> "" Then
ret = MsgBox("同名のファイルが存在します。上書きしますか?", vbYesNo)
If ret = vbNo Then Exit Sub
End If
FileCopy "C:\Users\Documents\レポート.xlsx","C:\Work\レポート.xlsx"
End Sub
Excel VBAには、FileCopyステートメントに似たメソッドとしてCopyFileメソッドがあります。今回紹介したFileCopyは1つのファイルのみをコピーして複製するのに対し、CopyFileメソッドは複数のファイルをまとめてコピーできるほか、コピー元のファイルが開かれていても複製することが可能です。詳しくは「【Excel VBA】複数のファイルをコピーする」を参照してください。