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(ファイルシステムオブジェクト)を使用すれば簡単に処理できます。
\逆引き辞書があると便利です/
[itemlink post_id=”1386″]