ファイルをコピーする際に使用する、
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だけあって入力候補のすぐそこにあります。
正確なスペルは覚えなくてよいのでご安心ください。