PR

【ExcelVBA】ファイルをコピーする方法(FileCopy、FilesystemObject)

ExcelVBAでファイルをコピーする方法_アイキャッチ ブックの操作

エクセルVBAでファイルをコピーする方法について説明します。
FileCopyステートメントを使用した方法と、FilesystemObjectを使用した方法をそれぞれ解説しています。

スポンサーリンク

ファイルをコピーする方法(FileCopyステートメント)

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」という名前のエクセルファイルをコピーします。

エクセルVBA-ファイルをコピーする方法-コピー前の状態

▽マクロ実行前
「ファイルA」がコピーされ「ファイルAのコピー」という名前のファイルが作成されました。

エクセルVBA-ファイルをコピーする方法-コピー後の状態
スポンサーリンク

すでに同じ名前のファイルがある場合、上書き保存確認をする

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

すでに同じ名前のファイルがある状態で上のマクロを実行すると、このようなメッセージボックスが表示されます。

エクセルVBA-ファイルをコピーする方法-上書き確認メッセージ

「はい」が選択された場合はコピーを実行して、「いいえ」が選択された場合はコピーを実行せずに終了します。

スポンサーリンク

コピー元ファイルが開かれていた場合のエラー(FileCopyステートメント)

FileCopyステートメントを使用したコピーではコピー元のファイルが開かれていた場合、実行時エラーが表示されます。

FileCopyステートメントが実行できず止まってしまいました。

実行時エラー70:書き込みできません。

エクセルVBA-ファイルをコピーする方法-ファイルが開かれていた場合の実行時エラー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
スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました