和風スパゲティのレシピ

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

FileCopyとFSO.CopyFileの違い

ファイルをコピーする際に使用する、
FileCopyステートメントとFileSystemObject.CopyFileメソッドの違いを解説します。

※ FileSystemObjectは以下FSOと略記します。

同じところ

どちらもコピー元・行先の2つのパスを受け取って、
その指示通りにファイルをコピーします。


以下のように同じ引数を渡せばまったく同じ動きをします。

FileCopy "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
           , "C:\Users\○○\Desktop\テスト1\Book1のコピー.xlsx"
' ↕ 同じ処理
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト1\Book1のコピー.xlsx"

違うところ

FSO.CopyFileメソッドの方が上位互換で、
FileCopyステートメントにはない以下の機能を有します。

ワイルドカード*と?が使用可能

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

ファイル名を省略でき、その場合は同名でコピー

FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\" ' ⇐ ここにファイル名を書かなくてよい

第3引数OverWriteFilesを設定できる

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

※ True時はFileCopyと同じく警告なしの上書きとなります。

開いているファイルをコピーできる

FileCopyステートメントは行先だけなく、
コピー元ファイルを開いていてもエラーとなります。

環境依存文字の対応範囲が広い

これはFSO全体の話になりますが、FSOはUnicode(UTF16)に対応しています。

例えば、

  • ①~⑳のフォルダはFileCopyステートメントでコピー可能
  • ㉑~㊿のフォルダはFSO.CopyFileメソッドでないとダメ

という違いが出ます。



以上がFSO.CopyFileメソッドのみが有する機能です。

反対にFileCopyステートメントにできて、
FSO.CopyFileメソッドにできないことはありません。


これ↓を書く(+参照設定の)手間があるという点を除けば完全上位互換ですね。

Dim FSO As New FileSystemObject

 

使い分け

常にFSO.CopyFileメソッドを使えばOKです。


上記のメリットが特に不要な単純なコピーをするだけなら、
FSOの準備がいらないFileCopyの方が手軽な気もします。


しかし「開いているファイルをコピーできる」というメリットについては、
手軽なコピーでも重要
になります。


コピー元のファイルを開いていても普通はコピーできますからね。
手作業でもできることなのでうっかりしやすいのです。


コピー元ファイルを開いていてもエラーというのは、
実際にマクロを動かす際に結構邪魔な例外になります。

面倒がらず、FSOを準備してCopyFileメソッドを使いましょう。


それぞれの詳細についてはこちらをご覧ください。
www.limecode.jp
www.limecode.jp





にしてもこの2つ、名前似すぎですよね笑

本ページの執筆時はどっちがどっちか混乱しまくりでした。


まあVBAで実際に書くときは、
Cだけあって入力候補のすぐそこにあります。

FSO.CopyFile


正確なスペルは覚えなくてよいのでご安心ください。