Access

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

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フォルダにコピーします。

複数フォルダのコピーなのでファイル名指定(単体コピーの①)はできません。

必ず、コピー先のフォルダの末尾には¥(/)をつけて指定します。

 

また、フォルダ内を探索して指定のフォルダのみコピーしたい場合は、以下のリンクを参考にしてサブフォルダをループ処理してください。

Access(VBA)でフォルダ内の全ファイルを順次処理する方法Windowsのフォルダやファイルを順次取得して、Accessの次の処理を行うこともよくあります。 例えば、指定のフォルダ配下にあ...

スポンサーリンク

CopyFolderのエラー処理

先に構文でお伝えしたように、CopyFolderメソッドはいくつかエラーが発生するケースがあります。

  • 実行時エラー76: パスが見つかりません。
  • 実行時エラー58:コピー先にすでに該当のフォルダが存在しています。

エラーはエラートラップ処理などを適切に組み込み、処理が止まらないように制御する必要があります。

エラートラップは、エラーラベルを定義してエラー時はエラーラベル内に処理を記述するのが一般的です。(On Err Goto ラベル)

無視して処理を続行する場合はResume Next。

処理を中断する場合は、Err.numberやErr.Descriptionなどを表示して処理を終了します。

CopyFolderはメソッドなのでfunctionのように値を戻しません。

よって、ret=fso.CopyFolder()のような記述はできません!

エラートラップ時のメッセージの記述方法は下記リンクの「エラートラップ時のMsgbox利用例」などを参考にしてください。

Msgboxのデフォルトを「いいえ」にする方法何をするにも欠かせないMsgbox関数。 「はい/いいえ」ボタンの表示や、「はい/いいえ/キャンセル」ボタンの表示などが一般的です...

 

スポンサーリンク

まとめ

AccessのVBAからフォルダをコピーする方法をご紹介しました。

今回もFSO(ファイルシステムオブジェクト)を使用すれば簡単に処理できます。

 

\逆引き辞書があると便利です/

ABOUT ME
アズビーパートナーズ
プログラマーと社内SEとしての経験を活かして、 情報システム部門のご相談を承ります。 得意な分野はAccessによる短納期開発、 BIツール(QlikSense/QlikView)の開発です。 現在はCMSを利用したホームページの作成にも力を入れています。
今のスキルのままで大丈夫?

あなたのスキル。今のままで大丈夫ですか?

時代のニーズに合った開発スキルを身につけてあなたの価値を高めましょう。

\オンラインでも教室でも学べるおすすめのスクール/

TECH::CAMP(エンジニアスクール)

まずは基礎から・・・という方はProgateUdemyどっとインストールなどがおすすめ!

スキルアップについて詳しくはこちら