VBAでフォルダをコピーする方法(プログラムコピペOK)

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

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(ファイルシステムオブジェクト)を使用すれば簡単に処理できます。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次