【ExcelVBA】フォルダ構成そのままにサブフォルダ含めて全てのフォルダと指定した拡張子を含むファイルを別フォルダにコピーするには②

この記事では、フォルダ構成そのままにサブフォルダ含めて全てのフォルダと指定した拡張子を含むファイルを別フォルダにコピーする方法についてご説明します。

【動画】フォルダ構成そのままにサブフォルダ含めて全てのフォルダと指定した拡張子を含むファイルを別フォルダにコピーする実際の動き

本題に入る前に、まずは次の動画をご覧ください。


コピー元のフォルダから、配下全てのフォルダをフォルダ構成そのままにサブフォルダ含めて全てのフォルダだけを別フォルダにコピーしています。

コピー処理は、コマンドプロンプトで実行する「robocopy」というコマンドを使って行っています。

「robocopy」というコマンドは、フォルダをバックアップ/同期させるコマンドで、「robocopy」に用意されているオプションを指定することでファイルのコピーも行うことができる便利なコマンドです。

参考 「robocopy」についてMICROSOFT 技術ドキュメント

マクロ作成の流れ

STEP.1
コマンドプロンプトを呼び出し、コピー元のフォルダパス、コピー先のフォルダパス、指定した拡張子をrobocopyコマンドの引数に指定してrobocopyコマンドを実行する
コマンドプロンプトを呼び出し、コピー元のフォルダパス、コピー先のフォルダパス、指定した拡張子をrobocopyコマンドの引数に指定してrobocopyコマンドを実行します。

Excelファイルの例

コピー元フォルダ名を入力するセルには「folderCopyFrom」と、コピー先フォルダ名を入力するセルには「folderCopyTo」という名前を付けています。

また、拡張子を入力するセルに「extension」という名前を付けています。

なお、複数の拡張子を対象にファイルをコピーしたい場合は、拡張子の文字列をカンマでつないで入力します。

コードの例

Excelのマクロのコード(例)

Option Explicit

Private Sub btn_copyFolderFile_Click()
    
    Dim folderCopyFrom  As String       'コピー元のフォルダパス
    Dim folderCopyTo    As String       'コピー先のフォルダパス
    Dim wkEStr          As Variant      '拡張子用変数
    Dim extStr          As String       '拡張子用変数
    Dim extStrAry()     As String       '拡張子格納用配列
    Dim cmdTxt          As String       'コマンドプロンプトのコード用変数
    Dim wshObj          As WshShell     'WshShellオブジェクト
        
    'コピー元のフォルダパスを取得する
    folderCopyFrom = Sheets("top").Range("folderCopyFrom").Value
    
    'コピー先のフォルダパスを取得する
    folderCopyTo = Sheets("top").Range("folderCopyTo").Value
    
    '指定された拡張子を取得する
    extStrAry = Split(Sheets("top").Range("extension").Value, ",")

    For Each wkEStr In extStrAry

        '拡張子を、ワイルドカード指定で変数に格納する
        extStr = extStr & "*." & wkEStr & " "

    Next wkEStr
    
    'WshShellオブジェクトからインスタンスを生成する
    Set wshObj = New WshShell
    
    'robocopy呼び出しコマンド文
    cmdTxt = "robocopy " & folderCopyFrom & " " & folderCopyTo & " " & extStr & " /e"
    
    'コマンドプロンプトで変数「cmdTxt」のコマンドを実行する
    Call wshObj.Run("%ComSpec% /c " & cmdTxt, 1, True)

End Sub

コードの解説

注目すべきコード

見て頂きたいのは33行目から36行目です。

    'robocopy呼び出しコマンド文
    cmdTxt = "robocopy " & folderCopyFrom & " " & folderCopyTo & " " & extStr & " /e"
    
    'コマンドプロンプトで変数「cmdTxt」のコマンドを実行する
    Call wshObj.Run("%ComSpec% /c " & cmdTxt, 1, True)

以上はrobocopyコマンドを呼び出して実行するコードです。

上記コードの33行目はrobocopyコマンドを実行するためのコマンド文を変数「cmdTxt」に格納していますが、参考として先に「Excelファイルの例」で実行した際のコマンド文を以下に記述します。

robocopy C:\work\10_勉強\10_VBA関連\0124\from C:\work\10_勉強\10_VBA関連\0124\to *.dll *.ini *.csv /e

以上のrobocopyコマンドに設定した引数とオプションは次の通りです。

引数

  1. 第1引数:コピー元のフォルダ名(フルパス)
  2. 第2引数:コピー先にコピーするフォルダとファイル一式のトップフォルダ名
    (※toというフォルダを新規作成してそのフォルダ内にサブフォルダとコピーしたい拡張子のファイル一式をコピーする)
  3. 第3引数:コピー対象とするファイルの拡張子(dll)
  4. 第4引数:コピー対象とするファイルの拡張子(ini)
  5. 第5引数:コピー対象とするファイルの拡張子(csv)
オプション

  1. 第1オプション:サブフォルダを作成する際に「/e」を付けます。このオプションを付けないとサブフォルダが作られません。
    また、この「/e」というオプションは、サブフォルダ内にファイルがなくてもコピー先にフォルダを作成します。

次に36行目でコマンドプロンプトを呼び出し、33行目で作成したコマンド文を実行します。

動作確認

マクロ実行前

コピー元フォルダのフォルダとコピー先のフォルダ、およびコピー対象にしたいファイルの拡張子を次のように指定してマクロを実行します。

今回コピー対象にしたいファイルの拡張子は複数あるので、カンマ区切りで複数を入力(dll,ini,csv)

マクロ実行後

マクロを実行すると、フォルダ構成そのままにサブフォルダ含めて全てのフォルダと、コピー対象にしたい拡張子のファイルだけが別フォルダにコピーされました。

※フォルダ数、ファイル数が多いので一部だけ結果をお見せします。

コピー元フォルダ

コピー先フォルダ

コピー元のファイル

コピー先のファイル

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。

参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。

  1. Windows Script Host Object Model(wshom.ocx)

なぜ必要かというと、Excelのマクロのコードの11行目の「WshShell」というオブジェクトが「wshom.ocx」というファイルを参照するからです。

    Dim wshObj          As WshShell     'WshShellオブジェクト

この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。

ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。

最後に

本記事では、フォルダ構成そのままにサブフォルダ含めて全てのフォルダと指定した拡張子を含むファイルを別フォルダにコピーする方法についてご説明しました。

「robocopy」というコマンドを使うことで、フォルダ構成そのままにサブフォルダ含めて全てのフォルダだけを別フォルダにコピーすることができます。

なお、「robocopy」コマンドは多くのオプションが用意されているので、そのオプションを活用することで今回挙げた例以外にも様々なフォルダ・ファイルコピー処理を行うことができます。

「robocopy」のオプションやその使い方については以下のサイトが役に立つと思います。

参考 「robocopy」についてMICROSOFT 技術ドキュメント

フォルダ構成そのままにフォルダをコピーしたい場合に、一部の拡張子のファイルもあわせてコピーしたい時には是非参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら