サイトについて      連絡先   検索

VBA フォルダのコピー

はじめに

Excel VBA マクロでフォルダをコピーする方法を紹介します。

CopyFolder 関数を使って指定したフォルダを別の名前や、他のフォルダにコピーまたは上書きできます。

ワイルドカードを使って複数のフォルダや全てのフォルダをまとめてコピーできます。

FileSystemObject について

ここでは VBA の標準の関数より便利な FileSystemObject を使った方法を紹介しています。基本的な使い方については「FileSystemObject ファイル操作の基礎」をご覧ください。

コードを見やすくするため FileSystemObject を参照設定しています。また、エラー処理は行っていません。

フォルダのコピー

指定したフォルダのコピー


Dim fso As FileSystemObject
Set fso = New FileSystemObject ' インスタンス化

Call fso.CopyFolder("D:\TipsFolder", "D:\TipsCopy", True)      ' フォルダ名を指定してコピー
Call fso.CopyFolder("D:\TipsFolder", "D:\ParentFolder\", True) ' 同じフォルダ名でコピー (D:\ParentFolder\TipsFolder)

' 後始末
Set fso = Nothing

fso.CopyFolder関数で指定したパスのフォルダをコピーします。

第 1 (source) 引数にコピーするフォルダのパスを指定します。フォルダが存在しないときはエラーが発生します。パスにはワイルドカードを指定できますが、詳しくは下記の「複数のフォルダのコピー」をご覧ください。

第 2 (destination) 引数にコピー先のパスを指定します。フォルダ名を含めるとそのフォルダ名でコピーします。パスの最後を \ 記号にすると、そのフォルダの中に同じフォルダ名でコピーします。パスが存在しないときはエラーが発生します。

第 3 (overwrite) 引数に True を指定すると上書きしてコピーします。上書きするフォルダやファイルが読み取り専用のときはエラーが発生し、そこで処理が中断します。それ以降のフォルダやファイルはコピーされません。False または省略すると既にフォルダが存在しているときはエラーが発生します。

サブフォルダをコピー


Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim pfl As Folder
Set pfl = fso.GetFolder("D:\ParentFolder") ' 親フォルダを取得

Dim fl As Folder
For Each fl In pfl.SubFolders ' サブフォルダの一覧を取得
    If fl.Name = "SubTips" Then              ' コピーしたいフォルダ
        Call fl.Copy("D:\TipsCopy", True)    ' フォルダ名を指定してコピー
        Call fl.Copy("D:\TipsFolder\", True) ' 同じフォルダ名でコピー (D:\TipsFolder\SubTips)
    End If
Next

' 後始末
Set fso = Nothing

fso.GetFolder関数で指定したパスの Folder オブジェクトを取得します。フォルダが存在しないときはエラーが発生します。

pfl.SubFoldersプロパティから、そのフォルダ内にある Folder オブジェクトの一覧を取得できます。

fl.Nameプロパティから、そのフォルダの名前を取得できます。これでコピーしたいフォルダを判定します。

fl.Copy関数でそのフォルダをコピーします。使い方は上記で説明したfso.CopyFolder関数と同じです。CopyFolder の第 1 (source) 引数に、そのフォルダのパスが渡されます。

複数のフォルダをコピー


Dim fso As FileSystemObject
Set fso = New FileSystemObject

Call fso.CopyFolder("D:\Tips*", "D:\ParentFolder\", True)        ' 複数のフォルダをまとめてコピー
Call fso.CopyFolder("D:\TipsFolder\*", "D:\ParentFolder\", True) ' 全てのフォルダをまとめてコピー

' 後始末
Set fso = Nothing

fso.CopyFolder関数の第 1 (source) 引数にワイルドカードを指定して、一致する複数のフォルダをまとめてコピーできます。1 つもフォルダが一致しないときはエラーが発生します。

使用できるワイルドカードには次のものがあります。

D:\Tips*を指定すると次のフォルダが一致します。


D:\Tips
D:\Tips1
D:\Tips12
D:\Tips123

D:\Tips?を指定すると次のフォルダが一致します。


D:\Tips
D:\Tips1
D:\Tips2

D:\TipsFolder\*を指定すると、TipsFolder フォルダ内のすべてのフォルダと一致します。

第 2 (destination) 引数には必ずパスの最後を \ 記号にしてフォルダを指定します。パスが存在しないときはエラーが発生します。

ワイルドカードに一致したすべてのフォルダが、指定したフォルダにコピーされます。

コピー中に読み取り専用に上書きするなどでエラーが発生したときは、そこで処理が中断されます。それ以降のフォルダやファイルはコピーされません。