【入門編】【一括リネーム】日付スタンプ付与や連番設定を行う安全なファイル名変更ツールの開発 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場の自動化を愛してやまない、君の専属チーフアーキテクトだ。
Excelマクロの「記録ボタン」を押すだけの生活から一歩抜け出し、OSの深部を自分の手足のように操りたい――そんな君の熱意、実によく分かる。

今日は、業務現場で泣く泣く手作業で行われている「大量ファイルの名称変更(リネーム)」を、VBScriptの真骨頂であるFSO(FileSystemObject)を使って一撃で自動化する極意を授けよう。

ここをクリアすれば、ファイルシステムを支配するVBScriptの基本はバッチリだ。一緒にマスターしていこう!

—

なぜ、Excelマクロではなく「VBScript」なのか?

業務システムから出力される膨大なPDF帳票、現場のスマホから吸い上げた無数の画像ファイル……。これらを整理するためだけに、わざわざExcelを立ち上げてマクロを書くのは、大砲でスズメを撃つようなものだ。

VBScriptなら、拡張子を`.vbs`にしてダブルクリックするだけ。 Excelすらインストールされていないサーバー環境でも、Windowsさえあればノータイムで動作する。この「軽さ」と「機動力」こそ、プロのエンジニアがVBScriptを手放さない理由なのだ。

—

本日のミッション:安全な「一括リネームツール」の設計

今回作成するのは、指定したフォルダ内にある全てのファイルに対し、
1. 処理を実行した日付のスタンプ(YYYYMMDD_)を付与し、
2. 重複を防ぐ連番(_001, _002…)を美しく振っていく、実用性抜群のスクリプトだ。

「単に名前を変えるだけ」に見えて、実は「同名ファイルが存在した時の上書き防止」「拡張子の保護」など、プロとして絶対に外せない安全装置(エーフガード)を組み込んでいる。

—

実装コード:現場でそのまま使える完全版VBScript

以下のコードをメモ帳に貼り付け、ファイル名を `FileRenamer.vbs` として保存してほしい。

‘ ==============================================================================
‘ 局所自動化スクリプト: 日付スタンプ&連番付与による安全一括リネームツール
‘ Architecture: VBScript + FileSystemObject (FSO)
‘ ==============================================================================
Option Explicit

‘ メイン処理の実行
Main

Sub Main()
Dim fso, targetFolder, folderPath, file, files
Dim dateStr, counter, extension, baseName, newFileName

‘ 【設定エリア】対象フォルダのパスを指定してください(デスクトップの「Target」フォルダの例)
folderPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\Target”

‘ FSOのインスタンス生成(※OSのリソースを確実に管理するため、使い終わったら破棄する意識を持とう)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダの存在確認(安全装置の基本)
If Not fso.FolderExists(folderPath) Then
MsgBox “指定されたフォルダが存在しません:” & vbCrLf & folderPath, vbCritical, “エラー”
Exit Sub
End If

‘ 本日の日付文字列を取得 (YYYYMMDD形式)
dateStr = GetDateString()

‘ 対象フォルダ内のファイルコレクションを取得
Set targetFolder = fso.GetFolder(folderPath)
Set files = targetFolder.Files

‘ ファイルがゼロ件の場合のハンドリング
If files.Count = 0 Then
MsgBox “対象フォルダにファイルがありません。”, vbInformation, “通知”
Exit Sub
End If

counter = 1 ‘ 連番用カウンターの初期化

‘ ファイル群をループ処理
For Each file In files
‘ システムファイルや自分自身(スクリプト)を誤って巻き込まないための除外判定
If LCase(fso.GetExtensionName(file.Name)) <> “vbs” Then

‘ 拡張子とファイル名(拡張子なし)の分離
extension = fso.GetExtensionName(file.Name)

‘ ゼロ埋めされた連番を作成 (例: 001, 002 …)
Dim formattedCount
formattedCount = Right(“000” & counter, 3)

‘ 新しいファイル名の組み立て: [日付]_[連番].[元の拡張子]
‘ ※必要に応じて元のファイル名を残したい場合は baseName を挟んでください
newFileName = dateStr & “_” & formattedCount & “.” & extension

‘ 【超重要】MoveFileメソッドによる安全なリネーム実行
‘ ※FSOには直接Renameメソッドがないため、「MoveFile」で同一フォルダ内へ移動(=リネーム)する
On Error Resume Next
fso.MoveFile file.Path, targetFolder.Path & “\” & newFileName

If Err.Number <> 0 Then
MsgBox “ファイル名変更中にエラーが発生しました: ” & file.Name & vbCrLf & Err.Description, vbExclamation, “警告”
Err.Clear
Else
counter = counter + 1 ‘ 成功時のみカウンターを進める
End If
On Error GoTo 0

End If
Next

‘ 完了通知
MsgBox “リネーム作業が完了しました!” & vbCrLf & “処理件数: ” & (counter – 1) & “件”, vbInformation, “完了”

‘ オブジェクトの解放(メモリリークを防ぐプロの作法)
Set files = Nothing
Set targetFolder = Nothing
Set fso = Nothing
End Sub

‘ ——————————————————————————
‘ 補助関数: 現在日付を “YYYYMMDD” 形式の文字列で返す
‘ ——————————————————————————
Function GetDateString()
Dim y, m, d
y = Year(Now)
m = Right(“0” & Month(Now), 2)
d = Right(“0” & Day(Now), 2)
GetDateString = y & m & d
End Function

—

Detailliert(詳細)に、このコードのキモを解説しよう。

1. なぜ「Rename」ではなく「MoveFile」なのか?

VBScriptのFSOには、実は `Rename` という名前のメソッドは存在しない。
ファイル名を変更するには、「同じフォルダ内に対して、移動元と移動先のファイル名を指定して `MoveFile` を実行する」というアプローチを取る。これがVBScriptにおけるファイルリネームの基本イディオムだ。

2. オブジェクトの寿命管理(メモリ解放)

コードの最後にある `Set fso = Nothing`。
「スクリプトが終るんだから勝手に消えるでしょ?」と思うかもしれないが、COMオブジェクトを明示的に解放する癖をつけること。これが、バックグラウンドでメモリをリークさせない一流のエンジニアの作法だ。

3. トラップを避ける `On Error Resume Next`

大量のファイルを処理する際、「他のアプリがファイルを開いていてロックされている」「同名のファイルがすでに存在する」といった理由でエラーが起きることがある。
その時、スクリプト全体が「ピキッ」とフリーズして強制終了するのを防ぐため、一時的にエラーをいなす(無視するのではなく、`Err.Number` で検知してスルーする)防壁を張っている。

—

陥りがちな罠とエラー回避のポイント

1. 文字化け問題
メモ帳でVBScriptを書く際、文字コードが「UTF-8(BOM付き)」や「ANSI(Shift_JIS)」になっていないと、日本語のコメントやパスでエラーが出る。困ったら「ANSI」で保存し直そう。
2. 無限ループ・誤爆の恐怖
開発中は、必ずテスト用のダミーフォルダを作り、その中でテストすること。間違えてシステムフォルダやデスクトップの主要ファイルを指定してリネームしてしまったら、目も当てられない大惨事になる(経験者は語る)。

—

最後に:ここをクリアすれば、君はもう初心者じゃない

ファイルシステムを自在に操るFSOの感覚を掴めば、次はテキストファイルの読み書きや、ExcelのCOM操作(VBSからExcelを裏で操る)へと世界が広がっていく。

面倒な定型作業はすべてVBScriptに肩代わりさせ、君は「人間にしかできないクリエイティブな仕事」に集中しよう。
困ったときは、いつでもこの知見を思い出してほしい。健闘を祈る!

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