この記事では、大量のデータをエクセルシートに記入された情報をもとに仕分けする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です。
サンプルコードの実行結果確認
最後に念のためこのコードを実行してみましょう。
実行前のフォルダ内はこんな感じです。
それでは、いざ実行!!!
先ほどのフォルダ内の大量のファイルはきれいになくなりました。
各フォルダの中を見てみましょう。
しっかりエクセルシートに記載されている通りに仕分けが行われることが確認できました。
(フォルダを並べたせいでちょっとわかりにくいですが、ちゃんとできてます。)
おわりに
というわけで今回は大量のファイルを条件に応じて仕分けする方法をご紹介しました。
なかなかない状況だとは思いますが、こんなこともエクセルでできるということは頭に入れておくと良いでしょう。
このように、私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント
はじめまして。にゃんこと申します。
コメント失礼します。
フォルダ分けの件でこちらの記事を見つけましたがうまくいかず、もし良い方法があれば教えてほしいです。
A列にファイル名
(例)
A000321456-2
A000532541-1
A000246152-1
A000321456-1
︙
B列にフォルダ名のリスト(エクセル)があるとします。
(例)
フォルダ名1
フォルダ名2
フォルダ名3
フォルダ名4
︙
A列のファイル名を探し、該当があればB列のフォルダに格納するというマクロはありますか。
A列はハイフンより前のみを探したいです。
ちなみに、ファイルはPDFです。
すごく時間がかかり、アドバイスいただけると嬉しいです。
コメントありがとうございます!
・仕分け先のフォルダがあらかじめ指定されている
・A列のファイルは書いてあってもない可能性もある
という状況ということでしょうか?
であれば、
1下記の記事の方法でファイルの存在を確認
2コメントいただいた記事と同じやり方でB列のフォルダに直接ファイルを移動
といった流れで実施できると思います。
【VBA】Dir関数の特性を詳細解説!ファイル確認や一括処理に超便利!
【VBA】Dir関数を使ったフォルダ内の探索事例5つ!ファイル名をセルに一括出力!
また不明点あればご質問ください(^^)
お返事ありがとうございます。
すみません。
フォルダは指定されているというより、エクセルの同じ行に記載のフォルダに移動したいといった状況です。
例えばA2セルの番号が含まれているものをフォルダから探し、B2セルのフォルダ名のフォルダに格納するといったイメージです。
実際のPDFは、A000321456-1となっていたり、A000321456-2と末尾だけ違うものもありますが、ハイフンより前が同じであれば、B列のフォルダ名は同じものが入力されています。
そうゆうことですね(^^)
であれば、とくに難しいことはなく、
A列ファイルの移動前後のフルパスを作成し、
Name 移動前のフルパス As 移動後のフルパス
という処理をすべての行に対して実行すればOKだと思います。
フルパスの作り方はこの記事でやっていることを応用すれば作れると思います。
また不明点あれば聞いてください。
ありがとうございます。
作ってみたのですが、ファイルが見つかりませんのエラー出てしまいました…
ファイル名は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
すみません。
やはり一度ファイル名とフォルダ名をエクセルに取得してから振り分けるといった方法のほうが良さそうですね。
ファイル名とフォルダ名の取得はうまくいきました。
A列にファイル名、B列もファイル名、C列にフォルダがあります。
その上でA2とB2のファイルをC2のフォルダに移動したいのですが、うまくいきませんでした。
タイミングによってファイルの数が増えたりするので、最終行はバラバラです。
なるほど。ようやく状況が理解できました。
であれば、やはりDir関数を使って、A列の番号が含まれているものを探し出して見つけたら順番にB列のフォルダに移動するという処理にした方が良いかもしれないですね(^^)
はじめまして。みかんと申します。
ヒガシさんとまったく同じスクリプトで動かしてみたのですが、
Name ThisWorkbook.Path & “\” & file_name As ThisWorkbook.Path & “\01_folder\” & file_name
で、「プロシージャの呼び出しまたは引数が不正です」となってしまいます。
動かしたいファイルは全てエクセルファイルです。
何か考えられる原因としてあげられるものはございますでしょうか。
ご質問ありがとうございます(^^)
フォルダ構成も私と同じ状況なのでしょうか?
動かしたいファイルと移動先のフォルダの階層やファイル名が違っていないか、まずはよく確認してみるのが良いと思います。