【入門編】【実務中級者向け】大量のドキュメント・画像をFSOで「最終更新月(YYYY-MM)」別フォルダへ自動仕分け・移動 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク
スポンサーリンク

散らかったフォルダを「知性」で整理する。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. さあ、次の一歩へ

お疲れ様でした! これであなたは、ファイルシステムを自在に操る強力な武器を手に入れました。

まずは、デスクトップにテスト用のフォルダを作り、適当なファイルをいくつか置いて、このスクリプトを走らせてみてください。ファイルが魔法のように整然と並ぶ様子を見るのは、エンジニアにとって最高の快感ですよ。

もし、もっと複雑な条件(「特定の拡張子だけ移動したい」「ファイル名に特定の文字が入っていたら……」など)を追加したくなったら、いつでも相談してください。

「自動化とは、退屈な作業から人間を解放し、創造的な時間を取り戻すための手段である」

この言葉を胸に、さらなる自動化の世界へ踏み出しましょう!

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