AccessのVBAからフォルダをコピーする方法です。
ワイルドカードを使って指定のフォルダをコピーする方法と存在するすべてのフォルダをコピーする方法もあります。
今回もFSO(ファイルシステムオブジェクト)を使用すれば簡単に処理できます。
フォルダをコピーするための事前準備
フォルダをコピーするにはFileSystemObjectを使用します。
VBAからこのライブラリを利用できるように、参照設定を追加する必要があります。
VisualBasic画面の上部メニューのツール → 参照設定 の順で選択します。
「Microsoft Script Runtime」にチェックを入れます。
この参照設定がなければコンパイルエラーとなります。

CopyFolderの構文
フォルダコピーにはFileSystemObjectのCopyFolderを使います。
fso.CopyFolder (元フォルダ, 先フォルダ, 上書きオプション)
CopyFolderの引数
| 元フォルダ | コピーする元のフォルダパスを指定する
 ※ワイルドカード指定可  | 
|---|---|
| 先フォルダ | コピー先のフォルダパスを指定する
 ●パスの末尾が¥(/)でない場合は、指定のパスでフォルダをコピーする ●パスの末尾に¥(/)がある場合は、指定のパスの配下に同名でフォルダをコピーする。  | 
| 上書きオプション | True:同名のフォルダがあれば上書きコピー
 False:同名のフォルダがあればエラー  | 
エラーになるケース
- 元フォルダが存在しない場合
 - 先フォルダの末尾に¥(/)を指定してそのパスが存在しない場合
 - 上書きオプションにTrueを指定し、存在するフォルダが読み取り専用だった場合
 - 上書きオプションにFalseを指定し、該当するフォルダが存在するとき
 
指定したフォルダをコピーする(単体コピー)
'*******************************************************************************
'   フォルダを指定してコピー(フォルダ名を指定/同名)
'*******************************************************************************
Private Sub CopyFld()
    Dim fso As FileSystemObject
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '(1)フォルダ名を指定してコピー
    Call fso.CopyFolder("C:\Tool\aaa", "C:\tool\bbb", True)
    
    '(2)同名フォルダを指定のフォルダにコピー
    Call fso.CopyFolder("C:\Tool\aaa", "C:\tool\ccc\", True)
    
    ' 後始末
    Set fso = Nothing
End Sub(1)はC:\toolフォルダ内で、aaaフォルダをbbbフォルダにコピーします。
(2)はc:\toolフォルダのサブフォルダcccフォルダにaaaフォルダをコピーします。
両者の違いは第2引数の末尾に¥(/)があるかないかです。
間違わないように気をつけましょう!
ワイルドカード指定で複数のフォルダを同名で指定のフォルダにコピー
'*******************************************************************************
'   フォルダを指定してコピー(フォルダ名を指定/同名)
'*******************************************************************************
Private Sub CopyFld_All()
    Dim fso As FileSystemObject
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    'ワイルドカード指定で複数のフォルダを同名で指定のフォルダにコピー
    Call fso.CopyFolder("C:\Tool\a*", "C:\tool\bbb\", True)
    
    ' 後始末
    Set fso = Nothing
End Subサンプルでは、C:\toolフォルダにある、『aから始まる全フォルダ』をC:\tool\bbbフォルダにコピーします。
複数フォルダのコピーなのでファイル名指定(単体コピーの①)はできません。
必ず、コピー先のフォルダの末尾には¥(/)をつけて指定します。
また、フォルダ内を探索して指定のフォルダのみコピーしたい場合は、以下のリンクを参考にしてサブフォルダをループ処理してください。

CopyFolderのエラー処理
先に構文でお伝えしたように、CopyFolderメソッドはいくつかエラーが発生するケースがあります。
- 実行時エラー76: パスが見つかりません。
 - 実行時エラー58:コピー先にすでに該当のフォルダが存在しています。
 
エラーはエラートラップ処理などを適切に組み込み、処理が止まらないように制御する必要があります。
エラートラップは、エラーラベルを定義してエラー時はエラーラベル内に処理を記述するのが一般的です。(On Err Goto ラベル)
無視して処理を続行する場合はResume Next。
処理を中断する場合は、Err.numberやErr.Descriptionなどを表示して処理を終了します。
CopyFolderはメソッドなのでfunctionのように値を戻しません。
よって、ret=fso.CopyFolder()のような記述はできません!
エラートラップ時のメッセージの記述方法は下記リンクの「エラートラップ時のMsgbox利用例」などを参考にしてください。

まとめ
AccessのVBAからフォルダをコピーする方法をご紹介しました。
今回もFSO(ファイルシステムオブジェクト)を使用すれば簡単に処理できます。

		
			
			
			
			
			
			
コメント