FileSystemObjectのCopyFileメソッド
FileSystemObjectのCopyFileメソッドは、引数で指定したファイルをコピーして別のファイルとして作成します。
FileSystemObjectの他のメソッドやプロパティは「FileSystemObjectとTextStreamのメソッド・プロパティ一覧」をご参照ください。
構文
Sub CopyFile(Source As String, Destination As String, [OverWriteFiles As Boolean = True])
Source | コピー元のファイルを指定します。
ファイル名だけを指定した場合はカレントディレクトリのファイルが対象になります。 ファイル名には*(アスタリスク)でのワイルドカード指定が可能です。 存在しないパスを指定した場合は、実行時エラー76「パスが見つかりません。」が発生し、存在しないファイルを指定した場合は、実行時エラー53「ファイルが見つかりません。」が発生します。 |
Destination | コピー先のフォルダまたはファイル名を指定します。
ファイル名だけを指定した場合はカレントディレクトリにコピーされます。 パスだけを指定する場合は右端に\をつけてフォルダであることを明示する必要があります。 右端に\がない場合は本来フォルダであるのにファイル名とみなされ、同名のフォルダが実在する場合は実行時エラー70「書き込みできません。」が発生します。 |
OverWriteFiles | コピー先のファイルが既に存在する場合に上書きするのであればTrue、上書きしないのであればFalseを設定します。
省略時はTrueになります。 Falseを設定している場合で既にファイルが存在している場合はエラー58「既に同名のファイルが存在しています。」が発生します。 |
エラー対応
ファイルのコピーにはいくつかのエラーが付きまといます。元のファイルがない、コピー先のフォルダがない、上書きできない、などです。
これらのエラーが発生するとメッセージボックスが表示され、処理はそこで止まってしまいます。
これらのエラーは気を付けていれば回避できることもありますが、タイミングによって回避できない場合も十分に考えられます。
言い方を変えると、CopyFileメソッドを使う場合はエラーを回避できないことがあるため、エラーが発生したときの対応を行っておく必要があります。
具体的には「On Error Goto XXX」でエラー発生時にエラーラベルまで処理を飛ばしたり、「On Error Resume Next」でエラーが発生しても処理を継続するようにするなどです。
よくあるミス
CopyFileメソッドでのよくあるミスがコピー先のフォルダを指定する場合の\の付け忘れです。
コピー先のフォルダが「C:\test\123」フォルダの場合、CopyFileの第二引数には右端に\を付けた”C:\test\123\”を指定しなければなりません。
\があるとフォルダ、なければファイルとみなします。
そのため、「C:\test\123.txt\」と書いた場合は見た目はファイル名に見えますが、「123.txt」というフォルダ、とみなします。
事前設定
以下のサンプルコードでは参照設定でFileSystemObjectクラスを利用できるようにしています。
FileSystemObjectクラスを利用するには、事前にVBA画面→ツールメニュー→参照設定、を選択し、参照設定ダイアログで「Microsoft Scripting Runtime」にチェックを付けます。
詳細は「VBAでのFileSystemObjectとTextStreamの使い方」の事前設定をご参照ください。
サンプルコード
コピー元のファイルをコピー先にコピーするサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub FileSystemObjectCopyFileTest() '// エラー発生時も処理を継続 On Error Resume Next Dim fso As New FileSystemObject '// FileSystemObjectクラス Dim sSource '// コピー元パス Dim sDest '// コピー先パス '// コピー元のファイルパスを指定 sSource = "C:\test\aaa.txt" '// コピー先のパスを指定 sDest = ActiveWorkbook.Path & "\" '// ファイルをコピー Call fso.CopyFile(Source:=sSource, Destination:=sDest, OverWriteFiles:=True) '// エラー発生時 If Err.Number <> 0 Then '// エラー内容を出力 Debug.Print Err.Number & " " & Err.Description End If End Sub |
コピー先のフォルダをアクティブブックがあるフォルダに指定しています。ActiveWorkBook.Pathは右端に\がないため付与しています。
CopyFileメソッドはいくつかのエラーが起こるため、サンプルコードにはエラー処理「On Error Resume Next」でエラーが発生しても処理を継続するようにしています。
エラーが発生した場合はその内容をイミディエイトウィンドウに出力します。