散らかったフォルダを「知性」で整理する。VBScriptで実現する、年月別ファイル自動仕分け術
こんにちは。自動化の荒波を渡り歩いてきた、あなたの技術的なメンターです。
「マクロの記録」を使って、Excelの操作を自動化することには成功した。でも、目の前にある「数千枚の画像やドキュメントが混在したフォルダ」をどうにかしたいと思ったとき、マクロの記録では力不足を感じたことはありませんか?
ファイルの名前を変える、フォルダを作る、ファイルを移動させる……これらはExcelの中の話ではなく、「OS(Windows)そのもの」を操作する領域です。
今日は、VBScriptの真骨頂とも言えるFileSystemObject(FSO)を使い、ファイルの「最終更新月」を読み取って、自動で「YYYY-MM」形式のフォルダへ仕分けていく、プロ仕様のアーカイブツールを一緒に作っていきましょう。
ここをクリアすれば、あなたは「記録する人」から「仕組みを作る人」へと進化できるはずですよ。
1. 今回のミッション:カオスを秩序に変える
私たちが作るのは、以下のような動きをするスクリプトです。
1. 指定したフォルダ内のファイルを一つずつチェックする。
2. そのファイルの「最終更新日」を取得する。
3. 更新日から「2023-10」のような年月情報を抜き出す。
4. 「2023-10」という名前のフォルダがなければ作る。
5. ファイルをそのフォルダの中へ移動させる。
これ、手作業でやるとどれだけ時間がかかるでしょうか? 1,000個のファイルがあれば、人間は必ずミスをします。しかし、スクリプトなら数秒で、しかも正確に終わらせることができます。
2. 武器となる「FileSystemObject (FSO)」の正体
VBScriptでファイル操作を行う際、必ず登場するのが `FileSystemObject` です。
これは、Windowsという広大な図書館における「超有能な司書さん」だと考えてください。
「このファイルはある?」「このフォルダを作って」「このファイルをあっちへ運んで」という命令を、この司書さんに伝えることで、私たちは直接Windowsを叩かずに安全に操作ができるのです。
3. 実践:全自動アーカイブスクリプト
それでは、魂を込めたコードを見ていきましょう。このコードは、ただ動くだけでなく、実務で耐えうる「堅牢さ」を意識して設計しています。
' =================================================================
' Script Name: AutoArchiveByMonth.vbs
' Description: ファイルの最終更新月に基づき、フォルダを自動作成して移動する
' Author: Your Senior Architect
' =================================================================
Option Explicit ' 変数の宣言を強制し、ケアレスミスを防ぐ(プロの鉄則です)
' --- 設定エリア ---
Dim targetFolderPath
targetFolderPath = "C:\Users\YourName\Desktop\TestFolder" ' ←ここを整理したいフォルダのパスに変更してください
' --- オブジェクトの宣言 ---
Dim fso, targetFolder, file, lastModDate
Dim yearMonth, destFolder
' 1. FileSystemObjectの生成
Set fso = CreateObject("Scripting.FileSystemObject")
' 2. 対象フォルダの存在確認
If Not fso.FolderExists(targetFolderPath) Then
MsgBox "エラー: 指定されたフォルダが見つかりません。" & vbCrLf & targetFolderPath, vbCritical
WScript.Quit
End If
Set targetFolder = fso.GetFolder(targetFolderPath)
' 3. フォルダ内のファイルをループ処理
' ※フォルダそのものを移動させないよう、Filesコレクションを回します
For Each file In targetFolder.Files
' ファイルの最終更新日を取得
lastModDate = file.DateLastModified
' 年月情報を YYYY-MM 形式で生成
' Month関数は 1, 2... と返すが、01, 02... としたいので工夫が必要
yearMonth = Year(lastModDate) & "-" & Right("0" & Month(lastModDate), 2)
' 移動先のフルパスを作成
Dim destPath
destPath = targetFolderPath & "\" & yearMonth
' 4. 移動先フォルダが存在しなければ作成
If Not fso.FolderExists(destPath) Then
fso.CreateFolder(destPath)
End If
' 5. ファイルの移動
' エラーハンドリング:ファイルが使用中の場合などに備える
On Error Resume Next
file.Move destPath & "\" & file.Name
If Err.Number <> 0 Then
' エラーが発生した場合はログ(デバッグ用)として表示、またはスキップ
' WScript.Echo "失敗: " & file.Name & " (理由: " & Err.Description & ")"
Err.Clear
End If
On Error GoTo 0 ' エラーハンドリングを標準に戻す
Next
' --- 後片付け(オブジェクトの解放) ---
' ライフサイクルを意識することは、メモリリークを防ぐエンジニアの嗜みです
Set file = Nothing
Set targetFolder = Nothing
Set fso = Nothing
MsgBox "整理が完了しました!", vbInformation, "Success"
4. アーキテクトの視点:ここが「プロ」の分かれ道
コードをただコピペするだけでは、あなたはまだ「使い手」です。このコードの裏側にある「設計思想」を理解して初めて、あなたは「作り手」になれます。
① `Option Explicit` の重要性
冒頭にあるこの一行。これがないと、VBScriptは「変数名の打ち間違い」をエラーにせず、勝手に新しい変数として扱ってしまいます。これは大規模な開発では致命的なバグを生みます。「厳格に、正しく」。これが自動化の基本です。
② 月のゼロ埋めテクニック
`Month(lastModDate)` は、1月なら `1` を返します。しかし、フォルダ名として `2023-1` よりも `2023-01` の方が、ファイル管理上(ソート順が綺麗になるため)望ましいですよね。
`Right(“0” & Month(lastModDate), 2)` という書き方は、一度頭に `0` を付けてから、右から2文字を切り出すという、VBScriptにおける「定石」です。
③ エラーハンドリングの作法
`On Error Resume Next` は、魔法の言葉に見えますが、使い所が肝心です。
もし、移動しようとしているファイルが「Excelで開かれっぱなし」だったらどうなるでしょう? スクリプトはそこで止まってしまいます。
私たちは、「失敗しても止まらず、次のファイルの処理へ進む」という粘り強い設計にしています。ただし、エラーが起きたことを無視し続けるのは危険なので、必ず `Err.Clear` でリセットする習慣をつけましょう。
④ オブジェクトのライフサイクル
最後に `Set fso = Nothing` としています。VBScriptは比較的賢いので、スクリプトが終わればメモリは解放されますが、大量のファイルを扱うプログラムでは、使い終わったリソースを明示的に手放す(解放する)癖をつけておきましょう。これが「大規模システム」を支えるエンジニアの規律です。
5. さあ、次の一歩へ
お疲れ様でした! これであなたは、ファイルシステムを自在に操る強力な武器を手に入れました。
まずは、デスクトップにテスト用のフォルダを作り、適当なファイルをいくつか置いて、このスクリプトを走らせてみてください。ファイルが魔法のように整然と並ぶ様子を見るのは、エンジニアにとって最高の快感ですよ。
もし、もっと複雑な条件(「特定の拡張子だけ移動したい」「ファイル名に特定の文字が入っていたら……」など)を追加したくなったら、いつでも相談してください。
「自動化とは、退屈な作業から人間を解放し、創造的な時間を取り戻すための手段である」
この言葉を胸に、さらなる自動化の世界へ踏み出しましょう!
