【VBA】大量のファイルを条件に応じてフォルダごとに仕分けする方法!

f:id:yshgs_elec:20210222214200p:plain

この記事では、大量のデータをエクセルシートに記入された情報をもとに仕分けするVBAのサンプルコードをご紹介しています。

 

状況に応じて微修正するだけで誰でも簡単に活用できるはずです。

 

それでは早速やっていきます!

スポンサーリンク

紹介するスキルの概要説明

まずはじめに今回の記事で紹介する内容を簡単にご説明しておきます。

 

今回は以下の画像のように

◆あるフォルダの中に大量のテキストファイルが入っている

◆そのファイルたちを仕分けする先のフォルダも同じフォルダに入っている

◆仕分けを実行するマクロファイルも同じフォルダに入っている

という状況でスキル解説していきます。

ファイル仕分けを実施するフォルダの中身確認結果

 

また、これらをどのように仕分けをするかは、これから実行するマクロファイルに記入されていることとします。

(A列にファイル名が、B列に仕分けする際に使う数字が入っています。)

今回はB列が1なら01_folderというフォルダに、2なら02_folderというフォルダに3なら03_folderというフォルダにそれぞれファイルを移動させることにします。

ファイルと仕分け先のフォルダを一覧化した結果

状況説明はこのくらいにして、さっそくこれらのデータを仕分けするコードを書いていきましょう。

 

なお、A列の情報は自動で取得することも可能です。

興味がある方は以下の記事を参考にしてみてください。

【VBA】Dir関数を使ったフォルダ内の探索事例5つ!ファイル名をセルに一括出力!

スポンサーリンク

ファイルの仕分けを行うVBAコード

さっそくですが、以下が条件に応じてファイルを仕分けするVBAサンプルコードです。

 

◆VBAサンプルコード

Sub shiwake()
    '変数の型を宣言
    Dim file_name As String
    Dim i As Integer
    'A列が空欄になるまで繰り返し処理を実施
    Do Until Cells(2 + i, 1) = ""
        file_name = Cells(2 + i, 1)
        '仕分け番号が1の場合
        If Cells(2 + i, 2) = 1 Then
        Name ThisWorkbook.Path & "\" & file_name As ThisWorkbook.Path & "\01_folder\" & file_name
        Else
        '仕分け番号が2の場合
        If Cells(2 + i, 2) = 2 Then
        Name ThisWorkbook.Path & "\" & file_name As ThisWorkbook.Path & "\02_folder\" & file_name
        Else
        '仕分け番号が3の場合
        If Cells(2 + i, 2) = 3 Then
        Name ThisWorkbook.Path & "\" & file_name As ThisWorkbook.Path & "\03_folder\" & file_name
        End If
        End If
        End If
        i = i + 1
    Loop
End Sub

◆サンプルコードの解説

ファイル移動スキル Name  A as B

A : 移動前のファイルのフルパス

B : 移動後のファイルのフルパス

これでファイルを移動することが出来ます。

 

基本的にはIF文を使い、このNameスキルの仕分け先を条件に応じて変更しているだけです。

もし仕分け先が4つ以上になる場合はその分IF文を増やしていけばOKです。

スポンサーリンク

サンプルコードの実行結果確認

最後に念のためこのコードを実行してみましょう。

 

実行前のフォルダ内はこんな感じです。

サンプルコード実行前のフォルダの中身

 

それでは、いざ実行!!!

 

先ほどのフォルダ内の大量のファイルはきれいになくなりました。サンプルコード実行後のフォルダの中身

各フォルダの中を見てみましょう。

仕分け先フォルダの中身確認結果

しっかりエクセルシートに記載されている通りに仕分けが行われることが確認できました。

(フォルダを並べたせいでちょっとわかりにくいですが、ちゃんとできてます。)

スポンサーリンク

おわりに

というわけで今回は大量のファイルを条件に応じて仕分けする方法をご紹介しました。

なかなかない状況だとは思いますが、こんなこともエクセルでできるということは頭に入れておくと良いでしょう。

 

このように、私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。

⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。

↓ 応援ボタン

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

それではまた!

コメント

  1. にゃんこ より:

    はじめまして。にゃんこと申します。
    コメント失礼します。
    フォルダ分けの件でこちらの記事を見つけましたがうまくいかず、もし良い方法があれば教えてほしいです。

    A列にファイル名
    (例)
    A000321456-2
    A000532541-1
    A000246152-1
    A000321456-1

    B列にフォルダ名のリスト(エクセル)があるとします。 
    (例)
    フォルダ名1
    フォルダ名2
    フォルダ名3
    フォルダ名4

    A列のファイル名を探し、該当があればB列のフォルダに格納するというマクロはありますか。
    A列はハイフンより前のみを探したいです。
    ちなみに、ファイルはPDFです。
    すごく時間がかかり、アドバイスいただけると嬉しいです。

  2. にゃんこ より:

    お返事ありがとうございます。
    すみません。
    フォルダは指定されているというより、エクセルの同じ行に記載のフォルダに移動したいといった状況です。
    例えばA2セルの番号が含まれているものをフォルダから探し、B2セルのフォルダ名のフォルダに格納するといったイメージです。
    実際のPDFは、A000321456-1となっていたり、A000321456-2と末尾だけ違うものもありますが、ハイフンより前が同じであれば、B列のフォルダ名は同じものが入力されています。

    • ヒガシ ヒガシ より:

      そうゆうことですね(^^)
      であれば、とくに難しいことはなく、
      A列ファイルの移動前後のフルパスを作成し、
      Name 移動前のフルパス As 移動後のフルパス
      という処理をすべての行に対して実行すればOKだと思います。

      フルパスの作り方はこの記事でやっていることを応用すれば作れると思います。
      また不明点あれば聞いてください。

  3. にゃんこ より:

    ありがとうございます。
    作ってみたのですが、ファイルが見つかりませんのエラー出てしまいました…
    ファイル名はA000321456-1となっていたり、POS_A000321456-2というものもありますが、A列にはA000321456の番号のみ記載があります。
    フォルダ名は会社名なので変則的ですが、B列とは完全一致しています。

    Sub shiwake() ’変数の型を宣言

    Dim file name As String
    Dim folder_name As String

    Dim i As Integer ‘A列が空欄になるまで繰り返し処理を実施

    Do Until Cells(2 + i, 1) = “”

    file_name = Cells(2 + i, 1)
    foldor_name = Cells(2+i, 2)

    Name ThisWorkbook.Path & & file_name As ThisWorkbook.Path &\foldor_name\” & file_name

    i=i+1

    Loop

    End Sub

  4. にゃんこ より:

    すみません。
    やはり一度ファイル名とフォルダ名をエクセルに取得してから振り分けるといった方法のほうが良さそうですね。
    ファイル名とフォルダ名の取得はうまくいきました。
    A列にファイル名、B列もファイル名、C列にフォルダがあります。
    その上でA2とB2のファイルをC2のフォルダに移動したいのですが、うまくいきませんでした。
    タイミングによってファイルの数が増えたりするので、最終行はバラバラです。

    • ヒガシ ヒガシ より:

      なるほど。ようやく状況が理解できました。
      であれば、やはりDir関数を使って、A列の番号が含まれているものを探し出して見つけたら順番にB列のフォルダに移動するという処理にした方が良いかもしれないですね(^^)

  5. みかん より:

    はじめまして。みかんと申します。
    ヒガシさんとまったく同じスクリプトで動かしてみたのですが、
    Name ThisWorkbook.Path & “\” & file_name As ThisWorkbook.Path & “\01_folder\” & file_name
    で、「プロシージャの呼び出しまたは引数が不正です」となってしまいます。
    動かしたいファイルは全てエクセルファイルです。
    何か考えられる原因としてあげられるものはございますでしょうか。

    • ヒガシ ヒガシ より:

      ご質問ありがとうございます(^^)
      フォルダ構成も私と同じ状況なのでしょうか?
      動かしたいファイルと移動先のフォルダの階層やファイル名が違っていないか、まずはよく確認してみるのが良いと思います。

タイトルとURLをコピーしました