ファイル操作

【VBA】ファイルをコピーする方法

更新日:2024/01/18

VBAで既存ファイルをコピーする方法をお伝えします。

 

ファイルをコピーする関数とメソッド

VBAでファイルをコピーする方法は3つあります。

基本的には、1のFileCopyステートメントを使用します。

2のCopyFileメソッドは、複数のファイルを一括でフォルダにコピーすることができます。

3のCopyメソッドは、Fileオブジェクト内に含まれる更新日付やサイズ等のファイル情報を使用できます。
コピー前にこれらの情報を確認する必要があるときは、Copyメソッドを使用します。

一部のファイル情報は、VBA関数で取得できます。
そのため3のCopyメソッドを使用する必要が無いケースがあります。
ファイル情報取得については、次のページをご覧ください。
【VBA】ファイル情報(作成日・サイズ・属性等)を取得する方法

 

FileCopyステートメント

FileCopyステートメントは、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。

構文

FileCopy source , destination
  1. source: コピー元ファイルのパス
  2. destination: コピー先ファイルのパス

ファイルが存在しない時やファイルが開かれているとき、エラーが発生します。

使用例

FileCopyステートメントの使用例です。
ファイルが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。

Sub fileCopySample()
    Const sourceFile As String = "C:\Users\xxx\Documents\0201.png"
    Const destinationFile As String = "C:\Users\xxx\Documents\0201(copy).png"
    
    On Error GoTo ErrorHandler
    
    FileCopy sourceFile, destinationFile
    MsgBox "コピーしました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

エラー処理ルーチンは様々な理由で実行されるので、エラーの特定が煩雑になります。
ファイルが存在しない可能性があるときは、FileCopyステートメントの実行前にDir関数でファイルの存在を確認するといいですね。
またコピー先ファイルが存在していて上書き確認するときも、Dir関数を使用します。

    If Dir(sourceFile, vbNormal) = "" Then
        MsgBox "コピー元ファイルが存在しません"
    Else
        If Dir(destinationFile, vbNormal) <> "" Then
            If MsgBox("コピー先ファイルが存在します。上書きしますか?", vbYesNo) = vbYes Then
                FileCopy sourceFile, destinationFile
                MsgBox "コピーしました"
            End If
        End If
    End If

 

CopyFileメソッド

CopyFileメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。

CopyFileメソッドを使用するには、まずはFileSystemObjectオブジェクトを取得する必要があります。

FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。

Dim fso As New Scripting.FileSystemObject

参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。

構文

FileSystemObjectオブジェクト.CopyFile source , destination , OverWriteFiles 
  1. source: コピー元ファイルのパス
  2. destination: コピー先ファイルのパス
  3. OverWriteFiles: 省略可能。上書きするかどうか

sourceのファイル名にワイルドカードが含まれる場合は、destinationはフォルダを指定します。
ファイル名にワイルドカードが含まれない時にdestinationがフォルダなら、エラーです。

次の二つのパターンで、指定します。

1.ファイルからファイルへコピー
 例 source: \フォルダ\abc.txt  destination: \フォルダ2\abc2.txt

2.ワイルドカード指定ファイルからフォルダへコピー
 例 source: \フォルダ\ab*.txt   destination: \フォルダ2\

使用例

CopyFileメソッドの使用例です。
次のコードはimageフォルダ内のPNG画像ファイルを、image2フォルダにコピーしています。

Sub copyFileSample()
    Const sourceFile As String = "C:\Users\xxx\Documents\image\*.png"
    Const destinationFile As String = "C:\Users\xxx\Documents\image2\"
    
    Dim fso As New Scripting.FileSystemObject

    On Error GoTo ErrorHandler
    
    fso.CopyFile sourceFilee, destinationFile,true
    MsgBox "コピーしました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

FileSystemObjectを取得している状態でファイルまたはフォルダの存在を確認するときは、FileExistsメソッドまたはFolderExistsメソッドを使用します。

FileSystemObjectオブジェクト.FileExists( FileSpec )
FileSystemObjectオブジェクト.FolderExists( FolderSpec )

いずれのメソッドも対象が存在するときはTrueを、存在しない時は False を返します。

 

Copyメソッド

CopyメソッドはFileオブジェクトのメンバーです。
Fileオブジェクトは、FileSystemObjectオブジェクトのGetFileメソッドで取得します。

Fileオブジェクトのプロパティについては、次のリンク先を確認してください。
Fileオブジェクトのプロパティ|【VBA】ファイル情報(作成日・サイズ・属性)を取得する方法

構文

set Fileオブジェクト = FileSystemObjectオブジェクト.GetFile( FilePath )
Fileオブジェクト.Copy Destination , OverWriteFiles
  1. FilePath: コピー元ファイルのパス
  2. destination: コピー先ファイルのパス
  3. OverWriteFiles: 省略可能。上書きするかどうか

ワイルドカード指定はできません。

使用例

Copyメソッドの使用例です。
次のコードはファイルの作成日時が2023/10/10以前のとき、別名でコピーしています。

Sub copySample()
    Const sourceFile As String = "C:\Users\xxx\Documents\image\image.png"
    Const destinationFile As String = "C:\Users\xxx\Documents\image\image_old.png"
    
    Dim fso As New Scripting.FileSystemObject
    Dim fo As file
    
    On Error GoTo ErrorHandler
        
    Set fo = fso.GetFile(sourceFile)
    If fo.DateCreated < #10/10/2023# Then
        fo.Copy destinationFile, True
    End If
    
FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

更新日:2024/01/18

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。