CopyFile について
ファイルのコピーって、必要ですよね!というわけで、コピーしちゃいますw
■CopyFileメソッド
そのままですけど、ファイルをコピーするためのメソッドです
ワイルドカード文字「*」を使用して複数ファイルのコピーも可能です
フォルダのコピーは別メソッドなので、それは別で紹介します!
・構文
構文は以下の通りです
object.CopyFile source, destination, [ overwrite ]
objectはFileSystemObjectのオブジェクトです
・パラメータ
メソッドのパラメータは以下の通りです
- source … コピーするファイルのパス
- destination … コピー先のフォルダやファイルのパス
- [overwrite] … 既存のファイルを上書きするかどうか
sourceには、コピーするファイルのパスを指定、ワイルドカード文字列をしようすることで複数ファイルを指定します(必須項目)
destinationには、コピー先フォルダやファイルを指定できますが、ワイルドカード文字列は使用不可です(必須項目)
[overwrite]には、コピー先フォルダにコピー元のファイルと同名ファイルがある場合に、上書きするかを設定します
True : 上書きする【デフォルト】、False : 上書きしない
・戻り値
メソッドの戻り値は以下の通りです
- なし
コピーが成功したかどうかを戻り値で受け取りたいところですけど、ないんですってー!
■例
・簡単なサンプル
①CopyFileのサンプル
Function CopyFile_Sample(source As String, destination As String, Optional overwrite As Boolean = True) As Boolean On Error Resume Next Dim obj As FileSystemObject Dim ret As Boolean ' オブジェクトを作成 Set obj = New FileSystemObject Err.Clear ' CopyFileの呼び出し Call obj.CopyFile(source, destination, overwrite) Debug.Print Err.Number, Err.Description ' オブジェクトを破棄 Set obj = Nothing ' 結果を返す CopyFile_Sample = ret End Function
②呼び出し元関数のサンプル
Sub CallCopyFile_Sample() Dim source As String Dim destination As String ' コピーするファイルパス source = "E:\VBA\Sample001\Sample.txt" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を呼び出す・・・(1) Call CopyFile_Sample(source, destination) ' コピー先を既存ファイルに指定 destination = "E:\VBA\Sample002\Sample.txt" ' 作成した関数を呼び出す・・・(2) Call CopyFile_Sample(source, destination) ' コピー先を存在しないファイルに指定 destination = "E:\VBA\Sample002\SampleCopy.txt" ' 作成した関数を呼び出す・・・(3) Call CopyFile_Sample(source, destination) ' コピーするファイルパス source = "E:\VBA\Sample001\Sample.txt" ' コピー先を既存ファイル(読み取り専用)に指定 destination = "E:\VBA\Sample002\ReadOnly.txt" ' 作成した関数を呼び出す・・・(4) Call CopyFile_Sample(source, destination) ' コピー先フォルダをパスの区切り文字終わらず既存フォルダを指定 destination = "E:\VBA\Sample002" ' 作成した関数を呼び出す・・・(5) Call CopyFile_Sample(source, destination) ' コピー先フォルダを存在しないパスの区切り文字終わらず指定 destination = "E:\VBA\Sample003" ' 作成した関数を呼び出す・・・(6) Call CopyFile_Sample(source, destination) ' コピーするファイルパス(ワイルドカード文字列を使用) source = "E:\VBA\Sample001\*.txt" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を呼び出す・・・(7) Call CopyFile_Sample(source, destination) ' コピーするファイルパス(ワイルドカード文字列を使用) source = "E:\VBA\Sample001\Sample.*" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を呼び出す・・・(8) Call CopyFile_Sample(source, destination) ' コピーするファイルパス(ワイルドカード文字列をフォルダに使用) source = "E:\VBA\Sample*\Sample.csv" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を呼び出す・・・(9) Call CopyFile_Sample(source, destination) ' コピーするファイルパス source = "E:\VBA\Sample001\Sample.txt" ' コピー先フォルダ(ワイルドカード文字列を使用) destination = "E:\VBA\Sample002\*.txt" ' 作成した関数を呼び出す・・・(10) Call CopyFile_Sample(source, destination) ' コピーするファイルパス(ワイルドカード文字列を使用して存在しないファイル) source = "E:\VBA\Sample001\ZZZ*.txt" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を呼び出す・・・(11) Call CopyFile_Sample(source, destination) ' コピーするファイルパス source = "E:\VBA\Sample001\Sample.txt" ' コピー先を既存ファイルに指定 destination = "E:\VBA\Sample002\Sample.txt" ' 作成した関数を上書きしないで呼び出す・・・(12) Call CopyFile_Sample(source, destination, False) ' コピーするファイルパス source = "E:\VBA\Sample001\Sample.txt" ' コピー先を既存ファイル(読み取り専用)に指定 destination = "E:\VBA\Sample002\ReadOnly.txt" ' 作成した関数を上書きしないで呼び出す・・・(13) Call CopyFile_Sample(source, destination, False) ' コピーするファイルパス(ワイルドカード文字列を使用) source = "E:\VBA\Sample001\*.csv" ' コピー先フォルダをパスの区切り文字終わりで指定 destination = "E:\VBA\Sample002\" ' 作成した関数を上書きしないで呼び出す・・・(14) Call CopyFile_Sample(source, destination, False) End Sub
③簡略化したCopyFileのサンプル
Function CopyFile_Sample2(source As String, destination As String) As Boolean ' オブジェクトを作成 With New FileSystemObject ' ファイルコピー Call .CopyFile(source, destination) End With End Function
・説明
呼び出し元関数のサンプルにて、想定できそうなパターンを網羅したつもりです!
以下のような階層にファイルが存在しているとして、サンプルを実行します
E:. ├─Sample001 │ Sample.csv │ Sample.txt │ Sample1.csv │ Sample1.txt │ └─Sample002 ReadOnly.txt Sample.txt
実行した結果は以下のようにイミディエイトウィンドウに表示されます
(1)~(3)と(6)~(8)が正常終了ということがわかります!
読み取り専用ファイルに対する動作は、(4)と(13)のように[overwrite]によってエラーが異なります
・・(4)と(13)かぁー不思議と縁起の悪い番号に割り振られたw
0 0 0 70 書き込みできません。 70 書き込みできません。 0 0 0 5 プロシージャの呼び出し、または引数が不正です。 5 プロシージャの呼び出し、または引数が不正です。 53 ファイルが見つかりません。 58 既に同名のファイルが存在しています。 58 既に同名のファイルが存在しています。 58 既に同名のファイルが存在しています。
実行結果後の階層はこうなります!
(6)ではフォルダではなく、ファイルが作成されたことが確認できますね
(14)では”Sample.csv”の上書きコピーが許可されずエラーとなったため、”Sample1.csv”はコピーされなかったことがわかりますね
E:. │ Sample003 │ ├─Sample001 │ Sample.csv │ Sample.txt │ Sample1.csv │ Sample1.txt │ └─Sample002 ReadOnly.txt Sample.csv Sample.txt Sample1.txt SampleCopy.txt
・注意点
- コピー先ファイルに上書きを許可しても、コピー先ファイルが読み取り専用の場合は、ファイルコピーがエラーになる
- コピー先の指定にはワイルドカード文字列は指定できない
- コピー元ファイルのワイルドカード文字列は、ファイル名や拡張子(最後のパス コンポーネント)にのみ使用可能
- コピー先はパスの区切り文字で終わっている場合に、既存フォルダと見なされる
- コピー先パスを区切り文字で終えずに既存フォルダを指定した場合は、書き込みエラーになる
- 複数ファイルのコピー時にエラーが発生したら、続きはコピーされない
・その他
TextStreamオブジェクトについて書くつもりでしたが、ファイルのコピーが意外と大事だったので、先に調べました!
あと、他のメソッドで記載したような注意点は、共通的なものでも何度も書かないことにしますので、他のメソッドも是非確認してくださいね!
ではでは