画像ファイルや動画ファイルの撮影日を取得して、年別フォルダの下に月別フォルダを作成し、自動で画像を移動して整理するエクセルマクロ(Excel VBA)を作りました。
撮影日の取得方法の詳細については、こちらに記述してあります。
ここは、上記記事の続きになります。主に、フォルダの作成手順とファイルを移動するマクロの解説と、エクセルマクロ有効ブックのダウンロードが行えます。
作成されるフォルダ構成は、4桁の年フォルダの中に2桁の月フォルダが自動作成され、画像や動画ファイルが格納されます。
画像や動画ファイルを格納しているフォルダを「参照」ボタンから指定する。
指定されたフォルダにおいてあるファイルを対象に、撮影日を取得して、必要なフォルダを作成し、ファイルを移動する。
ファイルへの全パスが256文字を超えないように気を付けてください。長すぎると移動できない可能性があります。
動作確認を行っている環境は、Windows11になります。MACはファイル操作が異なりますので、MAC用に制御を変更する必要があるはずです。
撮影日一覧は、前の記事画像ファイルや動画ファイルの撮影日を取得するマクロの実行結果として、得られているため、それを元に、必要なフォルダを作成して、画像ファイルや動画ファイルの移動を行います。
日付情報をセルから取得して、年と月のフォルダを作成して、ファイルを移動するマクロ
Sub フォルダ生成()
Dim FileSysObj As New FileSystemObject
Dim Basefolder As String
Dim pathSheet As Worksheet
Dim eachRng As Range
Dim endRow As Long
Dim yearInt As String
Dim monthInt As String
Dim chkPath As String
Basefolder = ThisWorkbook.Worksheets("実行").Range("B3").Value
Set pathSheet = ThisWorkbook.Worksheets("filelist")
endRow = pathSheet.Range("B" & Rows.Count).End(xlUp).Row
For Each eachRng In pathSheet.Range("B1:B" & endRow)
'年を取得 先頭4桁
yearStr = Mid(eachRng.Text, 1, 4)
'フォルダがなければつくる
chkPath = Basefolder & "\" & yearStr
If FileSysObj.FolderExists(chkPath) = False Then
MkDir chkPath
End If
'月を取得
monthStr = Mid(eachRng.Text, 5, 2)
'フォルダがなければつくる
chkPath = Basefolder & "\" & yearStr & "\" & monthStr
If FileSysObj.FolderExists(chkPath) = False Then
MkDir chkPath
End If
'ファイルの移動
'日付が入力されているB列の左側(A列)のパスを移動させる
Call FileSysObj.MoveFile(eachRng.Offset(0, -1).Text, chkPath & "\")
Next
Set FileSysObj = Nothing
End Sub
文字列の連結は、&を使用しています。
\マークは、フォルダ階層(/)をあらわすデリミタ(仕切り)です。
RangeオブジェクトのTextを呼び出すと、セルに表示されたままを取得できます。Valueで取得すると日付の場合は、シリアル値になったり、数値の場合は、先頭の0がないものとなったりします。セルの表示そのままを受け取りたい場合は、RangeオブジェクトのTextメソッドから受け取ります。
RangeメソッドのOffsetは、Rangeの位置を支点に移動する距離を支持します。Offset(0,-1)は、同じ行の手前の列を指し示します。(0が同じ行又は同じ列に使われます。左側の数値が行で右側が列に対する指示になります。)
コードの記述方法は、さまざまあり、Cellsオブジェクトで、行、列を数値で指示して書くこともできますが、あえて、Rangeを使用して、列名を数値ではなく、"A"や"B"で記述するようにしています。"A"や"B"を1,2と表記してもそれほど混乱しませんが、J列やAB列を数値で指定するととっさに位置が把握しずらいので、表現できるようなコードでは、なるべく列名で記載しています。
「eachRng.Offset(0, -1).Text」は、pathSheet.Range("A" & eachRng.Row).Text と同じ意味になります。今回は、Offsetを使いましたが、"A"と入っている方が、A列を参照していることが、わかりやすいかもしれません。
FileSystemObjectのMoveFileメソッドは、移動先のパスでファイル名を省略すると、同じファイル名での移動となります。
ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。
マクロの有効化手順については、こちらも参考にしてください。