ファイルをコピーする際に使用する、
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