和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ファイルをコピーする - FileCopyステートメント

ファイルをコピーする際に使用する、
FileCopyステートメントの使い方を解説します。

基本形

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

実行例

' 別のフォルダへコピー
FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
    
' 同じフォルダに別名ファイルとしてコピー
FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト1\Book1のコピー.xlsx"

解説

FileCopyステートメントは1つのファイルのコピーします。

基本形、実行例の通り、とても単純なステートメントで、
コピー元と行先のファイルパスを渡すと、その通りにコピーします。


コピー時にファイル名を変更することも可能で、
それを利用すれば同フォルダ内にコピーすることができます。


逆にこの活用ができるため、

  • 別フォルダにコピーをしているか
  • コピー時にリネームをしているか

が読み取りづらくなってしまう懸念があります。


サンプルのようにアンダースコア「 _ 」を使ってコードを改行し、
上手くインデントを合わせてパスを縦に並べるようにしましょう。

FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
' ↕ どっちが読みやすいかは一目瞭然
FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"

 

注意点と発生エラー

既にファイルがある場合は無警告の上書きになる

最も注意すべきはファイルの上書きです。

 別のフォルダへコピー
FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"

このコードにおいて、テスト2フォルダに既にBook1があった場合は、
警告なしに上書きが実行されます。


上書きを行いたくない場合は、事前にファイルの存在判定を行ってください。

If Dir("C:\Users\○○\Desktop\テスト2\Book1.xlsx") = "" Then
    FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
               , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
Else
    行先のパスにすでにファイルがあった場合の処理
End If

 

行先だけでなくコピー元ファイルを開いていてもエラー

上記の通りFileCopyは上書き保存を行うため、もし行先のファイルを開いていれば

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

エラーとなります。

これは当然ですね。


しかし注意しなければいけないのはこれだけでなく、
コピー元ファイルを開いている場合も同じエラーになります。


例えば、

FileCopy Thisworkbook.FullName, "~~"

これはいついかなる場合でもエラーになります。

このコードはThisworkbookが実行しているのですから当然ですね。


この仕様はうっかりしやすいので注意しましょう。

ファイル名は省略できません。

感覚的にやってしまいそうになる、

FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト2\"

これは「パスが見つかりません」エラーになります。


\をなくした

FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
            , "C:\Users\○○\Desktop\テスト2"

こっちも「パス名が無効です」エラーになります。


「フォルダだけを指定すると同名のままコピー」
という機能はFileCopyすーてとメントにはありません。

行先のフォルダがない

コピー先のフォルダが存在しない場合は、

実行時エラー76「パスが見つかりません。」

エラーとなります。

フォルダが必要な場合は先に作成してから実行してください。

上位互換:FileSystemObject.CopyFileメソッド

FileSystemObject(以下FSO)にもファイルをコピーするメソッドがあり、
名前が似ていて紛らわしいのですが「CopyFileメソッド」が該当します。


このCopyFileメソッドは、前述のFileCopyの注意点のうち、

  • 上書きをするかどうかを指定する
  • 開いているファイルをコピーする
  • ファイル名を省略すると同名でコピーされる

この3つに対応しています。

Dim FSO As New FileSystemObject

' 上書きしない(もしファイルがあればエラーが出るようになる)
FSO.CopyFile 元ファイルパス, 行先ファイルパス, OverWriteFiles:= False

' 開いているファイルをコピー
FSO.CopyFile Thisworkbook.FullName, 行先ファイルパス

' 同名で別フォルダにコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                   , "C:\Users\○○\Desktop\テスト2\"

 
さらにCopyFileメソッドはファイル名にワイルドカード*が使用でき、
複数のファイルを一気に移動することも可能
です。

' xlsxファイルをすべてコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

素晴らしいですね。


両者を比較すると、

Dim FSO As New FileSystemObject

これを書く必要がある以外はCopyFileメソッドが完全上位互換です。


少しでも複雑なファイルのコピーを行う場合は、
FSO.CopyFileメソッドの方を使用してください。

詳細はこちらをどうぞ。
www.limecode.jp