Excel VBA FileSystemObjectでフォルダをコピーする

ファイル/フォルダ操作

今回は「FileSystemObject」オブジェクトを使用してフォルダをコピーする方法をご説明します。

FileSystemObject」オブジェクトとは、ドライブ、フォルダ、ファイルを操作する事ができるオブジェクトです。

「FileSystemObject」オブジェクトの使い方も併せてご説明します。

他のファイル/フォルダの操作は次の記事をご覧ください。

1.FileSystemObjectの使い方

FileSystemObject」オブジェクトは、ドライブ、フォルダ、ファイルなどを操作する事ができるオブジェクトです。

FileSystemObjectを使用するには「CreateObject」メソッドを使用して次のように記載します。

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
FileSystemObjectのメソッド一覧
メソッド操作内容
BuildPathパスの末尾に、指定したフォルダ名を追加したパスを返します
CopyFileファイルをコピーします
CopyFolderフォルダをコピーします
CreateFolder新しいフォルダを作成します
CreateTextFile新しいテキストファイルを作成します
DeleteFileファイルを削除します
DeleteFolderフォルダを削除します
DriveExistsドライブが存在するかどうか調べます
FileExistsファイルが存在するかどうか調べます
FolderExistsフォルダが存在するかどうか調べます
GetAbsolutePathName省略したパスから完全なパス名を返します
GetBaseName拡張子を除いたファイルのベース名を返します
GetDrive指定したDriveオブジェクトを返します
GetDriveName指定したドライブの名前を返します
GetExtensionNameファイルの拡張子を返します
GetFile指定したFileオブジェクトを返します
GetFileName指定したファイルの名前を返します
GetFolder指定したFolderオブジェクトを返します
GetParentFolderName指定したフォルダの親フォルダを返します
GetSpecialFolderシステムが使用する特別なフォルダのパスを返します
GetTempName一時的なファイル名を生成します
MoveFileファイルを移動します
MoveFolderフォルダを移動します
OpenTextFile指定したTextStreamオブジェクトを返します

2.フォルダのコピー

書式は「FileSystemObject.CopyFolder source, destination[, overwrite]」と書きます。

引数の説明

source

コピー元のフォルダパスを指定します。

ワイルドカードを使用する事ができます。

sourceは省略する事ができません。

指定したフォルダが存在しない場合、エラーが発生します。

destination

コピー先のフォルダパスを指定します。

ワイルドカードを使用する事ができず、省略もできません。

コピー先フォルダパスをコピー元のフォルダパスと変更する事で、フォルダ名の変更が可能です。

overwrite

コピー先に同一フォルダが存在する場合に、True/Falseで上書きするか指定します。

Trueを指定すると上書きし、Falseを指定すると上書きしませんが、同じフォルダ名があるとエラーになります。

省略することが可能で、省略するとTrueが指定されます。

3.サンプルコード

コピー元と異なるコピー先を指定してコピーする

フォルダ名をそのまま、コピー元とは異なるパスを指定してコピーします。

Sub Sample1()

Dim FSO As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")

    FSO.CopyFolder Source:="C:\Sample1\TEST", Destination:="C:\Sample2\TEST"

    Set FSO = Nothing

End Sub

フォルダ名を変更してコピーする

コピー元と同一であっても、異なっていてもフォルダ名を変更する事ができます。

Sub Sample2()

Dim FSO As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")

    FSO.CopyFolder Source:="C:\Sample1\TEST", Destination:="C:\Sample1\TEST1"

    Set FSO = Nothing

End Sub

複数のフォルダをコピーする

ワイルドカードを使用して、1度に複数のフォルダをコピーします。

Sub Sample3()

Dim FSO As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")

    FSO.CopyFolder Source:="C:\Sample1\TEST*", Destination:="C:\Backup\"
    
    Set FSO = Nothing

End Sub

エラーを回避する

エラーコードとエラー結果

コピー元に指定したフォルダが存在しない場合、エラーが発生します。

Sub Sample4()

Dim FSO As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")

    FSO.CopyFolder "C:\Sample1\TESTO", "C:\Sample1\TEST"
    
    Set FSO = Nothing

End Sub

また、「overwrite」でFalseを指定すると同じフォルダ名があるとエラーになります。

Sub Sample5()

Dim FSO As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")

    FSO.CopyFolder "C:\Sample1\TEST", "C:\Sample1\TEST", overwritefiles:=False

    Set FSO = Nothing

End Sub
エラーを回避するサンプルコード

指定したフォルダが存在するか、同一フォルダ名が存在するかの2つのエラー回避が組み込まれています。

Sub Sample6()

Dim FSO         As Object
Dim myFolder    As String

    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    myFolder = "C:\Sample1\TEST"
    
    If Dir(myFolder, vbDirectory) = "" Then 'ファイルの存在チェック
    
        MsgBox "フォルダが存在しません。"
        
    Else
    
        '同一フォルダ名が存在する場合回避
        On Error GoTo ErrLabel
        
        FSO.CopyFolder Source:=myFolder, Destination:="C:\Sample1\TEST", overwritefiles:=False
        
     End If
    
    Set FSO = Nothing

    Exit Sub
    
ErrLabel:

    MsgBox Err.Description

End Sub
コードの説明

「If Dir(myFolder, vbDirectory) = “” Then」で指定したフォルダが存在するか判定しています。

存在しない場合はメッセージボックスが表示されます。

「On Error GoTo ErrLabel」で、フォルダを指定した場所に格納しようとした際に、同じフォルダが存在した場合の回避として、エラーが発生した場合は「ErrLabel:」まで実行がスキップされ、エラー内容がメッセージボックスに表示されます。

エラー処理については「「On Error」でエラー処理」をご覧下さい。

タイトルとURLをコピーしました