今回はExcel初心者の僕が初めてマクロに触れてみました。挑戦したことは「大量の画像ファイルをフォルダに振り分ける」というミッション。
正直マクロの印象は「難しい…意味わかんない…。」
初心者としてこのミッションを乗り越えるにはまず調べること。これが大切です。
「マクロって何だろう?何が出来るの?何するの??」
わからないことは考えても時間の無駄です。同じような悩みを持った方は必ずいますので、結構欲しい回答が得られものです。考えることは問題解決してからゆっくりやればいいと思います。
やりたいこと
タイトルにも書きましたが「大量の画像ファイルをフォルダに振り分ける」ことです。
もともとフォルダ分けする必要がないと聞いていたのでひとつのフォルダにまとめて保管していました。が急遽フォルダ分けが必要となりました。
持っているデータは「品番-連番」という画像ファイル。品番ごとにファイルを作ってそれぞれの画像を振り分けていく作業を自動でやりたいです。
添付画像はテストですので少ないですが、実際は1,000品番(3,000ファイル)ぐらいの作業でした。当然、一つずつ作業という選択肢はないですよね。早く、そして楽に片付けるために今回もググります。
調べて得た情報を早速実践
調べたらすぐに似たような質問が出てきました。

ファイル名からフォルダを生成して振り分けてくれるソフトってありますか?
この質問者さんも僕と同様に大量の連番ファイルを使うようです。その管理をするために必要なのだとか…。違う点は、品番と連番を結ぶ記号が違う程度です。
そしてその回答が
Excelマクロを作ってみました。
1.Excelを起動し [Alt]+[F11] で開く Visual Basic Editor のウィン
ドウで、[挿入]-[標準モジュール] とたどります。
2.[ツール]-[参照設定] で Microsoft Scripting Runtime を指定しま
す。
3.標準モジュールに下記をコピペして、そのウィンドウを閉じます。Sub Furiwake() ’ファイル名の連番前の文字列でフォルダを作り分配。
Dim FPath1, FPath2, FName
Application.ScreenUpdating = False
FPath1 = Range(“A1”).Value & “\”
FName = Dir$(FPath1 & “*.*”)
Do While FName <> “”
Select Case InStr(FName, “_”)
Case Is > 0
FPath2 = Left(FName, InStr(FName, “_”) – 1)
Case Else
FPath2 = Left(FName, InStr(FName, “.”) – 1)
End Select
On Error Resume Next
MkDir$ FPath1 & FPath2
On Error GoTo 0
FileCopy FPath1 & FName, FPath1 & FPath2 & “\” & FName
‘ Kill FPath1 & FName ’※
FName = Dir$
Loop
Application.ScreenUpdating = True
End Subシートのセル A1 に、画像ファイルのあるフォルダのフルパスを次の
ように入力して、[ツール]-[マクロ]-[マクロ] から Furiwake を指定
して実行します。
入力例: C:\MyFiles\PhotoData\JPGFiles
この入力されたフォルダの中にサブフォルダを作成して振り分けます。※の行の先頭の Kill の前にある ’を削除して実行すると、元画像
ファイルが削除されてしまいますので、テストはこのまま実行して
ください。
こんな文字列を見慣れていない僕には何も理解できませんでしたが、とりあえず言われたまま実践してみました。
①
エクセルを開いてA1セルに画像が入っているフォルダのネットワークパスを入力。
フォルダのパスは、「対象のフォルダを右クリック」➡「プロパティ」➡「共有タブ」で表示されます。
②
「Ait」キーと「F11」キーを押して「Microsoft visual basic」を開きます。開いたら「挿入」➡「標準モジュール」
③
「ツール」➡「参照設定」で「Microsoft Scripting Runtime」を選ぶ。
④
標準モジュールにコードをコピペ
⑤
「ツール」➡「マクロ」➡「Furiwake」で実行。
結果は当然のように失敗しました。最初は何が何だかわからなかったのですが、質問者さんの文章をもう一度読み返すと、「連番前の区切りは、ピリオド.かアンダーバー_」。僕が使っているデータはハイフン‐です。
文字列の
Case Is > 0
FPath2 = Left(FName, InStr(FName, “_”) – 1)
Case Else
FPath2 = Left(FName, InStr(FName, “.”) – 1)
End Select
結果をもとにアレンジしてみる
定時まで時間がありますので
勉強がてら先ほどのコードをアレンジしてみたいと思います。質問者さん仕様に作られたこのコードは「ピリオド」あるいは「アンダーバー」で区切っているパターンです。僕の場合は「ハイフン」のみ。要するに僕よりも難しい条件でコードが作られている。と想像できます。
Case Is > 0
FPath2 = Left(FName, InStr(FName, “_”) – 1)
Case Else
FPath2 = Left(FName, InStr(FName, “.”) – 1)
End Select
それ以外=×
2種類の〇がある一方、「ハイフン」の時だけ作動する。それ以外は作動しない。ということは「1種類の〇or×の判断だけ」。

複数のCaseは必要ないのではないか?
ExcelとVBAの入門解説|エクセルの神髄 (excel-ubara.com)
「エクセルの神髄」様を利用させていただき分かったことは「If」を使うこと。
ページを切り替えてコードを一文ずつ和訳wして、自分なりにかみ砕いて分かり易くした結果、たどり着いたコードは
Dim FPath1, FPath2, FName
Application.ScreenUpdating = FalseFPath1 = Range(“A1”).Value & “\”FName = Dir$(FPath1 & “*.*”)Do While FName <> “”If InStr(FName, “-“) > 0 ThenFPath2 = Left(FName, InStr(FName, “-“) – 1)End IfOn Error Resume NextMkDir$ FPath1 & FPath2On Error GoTo 0
FileCopy FPath1 & FName, FPath1 & FPath2 & “\” & FName
Kill FPath1 & FName
FName = Dir$
Loop
Application.ScreenUpdating = True
かなりの付け焼刃なので不安ではありますが、先ほどのCase部分を
FPath2 = Left(FName, InStr(FName, “-“) – 1)End If
に変更してみました。
結果を言うと、動作はしてくれました。
このコードの良し悪しは分かりません。もっと簡易的な方法もあるかと思います。がとりあえず僕が仕事で使う分には問題ないのでOKかな?というのと、初心者でも調べてマネして実践してみれば仕事が効率化できるのです。専門知識があるに越したことはないですけど、初めから諦めてしまうのはもったいないのでとりあえず手を出してみることは大切だと思います。
まとめ
仕事を効率化するために「マクロ」という名前は知ってはいましたが、敷居が高く嫌煙しておりました。当然今もわからないコトだらけです。ですが、繰り返し同じことをする作業に時間をかけるというのが時間の使い方として一番もったいないですよね。数時間かかる作業を数分、もっと言うなら数秒で終わらしてしまうことが可能になるのです。そして人為的なミスも起こらない。メリットばかりです。(時間が出来て仕事を振られるというデメリットはあるかもですが…)
職場ではPCを使って作業をする以上は、効率化を図ることを考えるように言われています。(ただの総合職なんですけどね(;^ω^))毎日当たり前のようにやっている作業に疑問を持ち、少しでも…1行程だけでも自動化できるように考えています。プロでもないしその手の知識は皆無なのでコードを組んだり仕組みを作ることは、僕みたいな素人には出来ません。
僕たちが出来ることは「この作業自動化出来ないかな?」と疑問を持つ事と、疑問を持ったら検索して実践することが大切です。僕も少しでも勉強してアウトプットできたらいいなと思います。
前回はExcelを使ってこんなことに挑戦してみました。
【Excel】初心者でもできた!第2・第4土曜日を返す計算式を解説(2022年版) | えーよんのーと (a4hunter.com)
・調べて得た情報をもとに自身が抱える問題用にアレンジしていきます。