はじめに:手作業の「繰り返し」に終止符を打とう
「毎日、特定のフォルダに溜まっていくファイルの中から、今日作成されたものだけをピックアップして別の場所に移動する……」
もしあなたが、そんな作業をマウスのドラッグ&ドロップで繰り返しているとしたら、今日、その習慣に別れを告げましょう。プログラミングの世界へようこそ。
VBScript(Visual Basic Scripting Edition)は、Windows環境において最も手軽に、かつ強力に業務を自動化できる武器の一つです。マクロの記録から一歩踏み出し、「自らの手でロジックを書く」楽しさと、自動化による圧倒的な解放感をぜひ味わってほしいと思っています。
今回のテーマは、「今日作成されたファイルだけを自動で選別する」スクリプトです。一見シンプルですが、実は初心者の方が必ずと言っていいほど躓く「日付比較の罠」が隠されています。そこを乗り越えて、真の自動化エンジニアへの第一歩を踏み出しましょう。
核心:FileSystemObject(FSO)とは何か?
VBScriptでファイルやフォルダを操作する際、絶対に避けて通れないのが FileSystemObject(通称:FSO) です。
例えるなら、FSOはあなたの代わりにパソコン内の棚(フォルダ)を調べ、書類(ファイル)を手に取り、別の棚へ移してくれる「超優秀な事務助手」のような存在です。
通常、VBScriptはただの「命令文の羅列」ですが、`CreateObject(“Scripting.FileSystemObject”)` という一行を記述することで、スクリプトに「ファイル操作という能力」を授けることができるのです。
⚠️ 罠に注意:なぜ「日付の比較」は失敗しやすいのか?
ここからが、本日の講義の最も重要なポイントです。
「今日作成されたファイルを探す」というロジックを考えるとき、多くの初心者は次のような思考に陥ります。
> 「ファイルの作成日時(DateCreated)が、今日の日付(Date)と同じならコピーする」
一見、完璧に見えますよね? しかし、これではプログラムは一つもファイルを拾ってくれません。
なぜ失敗するのか?
理由は、「時間」の存在です。
- `Date` 関数(今日) が返す値: `2023/10/27 00:00:00` (時刻は切り捨てられた状態)
- `DateCreated` プロパティ が返す値: `2023/10/27 14:30:05` (作成した瞬間の時刻が含まれる)
コンピュータにとって、`00:00:00` と `14:30:05` は全く別の値です。これでは「一致しない」と判定されてしまいます。
ここをクリアすれば、VBScriptの基本はバッチリですよ。
解決策は簡単です。比較する際に、ファイルの作成日時から「時刻部分を切り捨てて、日付だけに変換する」のです。
実践:本日作成されたファイルだけを抽出するスクリプト
それでは、実際に動くコードを見てみましょう。このコードは、指定したフォルダをスキャンし、今日作成されたファイルを見つけたら、指定したバックアップフォルダへコピーします。
' ==========================================================================
' テーマ:本日作成されたファイルを抽出してコピーするスクリプト
' 作成者:Legendary Architect
' ==========================================================================
Option Explicit ' 変数の宣言を強制し、ケアレスミスを防ぐ(プロの必須習慣!)
' --- 設定エリア ---
Dim strSourceFolder, strDestFolder
strSourceFolder = "C:\Work\Input" ' 監視対象のフォルダ
strDestFolder = "C:\Work\Backup" ' コピー先のフォルダ
' --- メイン処理 ---
Dim objFSO, objSourceFolder, objFile
Dim targetDate
' 1. FSO(事務助手)を召喚する
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 2. フォルダの存在チェック(エラー防止の鉄則)
If Not objFSO.FolderExists(strSourceFolder) Then
MsgBox "エラー:コピー元フォルダが見つかりません。" & vbCrLf & strSourceFolder, vbCritical
WScript.Quit
End If
If Not objFSO.FolderExists(strDestFolder) Then
' コピー先がなければ作成する
objFSO.CreateFolder(strDestFolder)
End If
' 3. 「今日」の日付を取得(時刻を切り捨てた純粋な日付のみ)
targetDate = Date
' 4. フォルダ内のファイルを一つずつチェック
Set objSourceFolder = objFSO.GetFolder(strSourceFolder)
Dim copyCount
copyCount = 0
For Each objFile In objSourceFolder.Files
' 【重要】DateValue関数を使い、ファイルの作成日時から時刻成分を取り除く
' これにより、「日付のみ」の比較が可能になる
If DateValue(objFile.DateCreated) = targetDate Then
' ファイルをコピー(Trueは、同名ファイルがある場合に上書きする設定)
objFSO.CopyFile objFile.Path, strDestFolder & "\" & objFile.Name, True
copyCount = copyCount + 1
End If
Next
' 5. 結果報告
If copyCount > 0 Then
MsgBox copyCount & " 件のファイルを本日分としてコピーしました。", vbInformation, "完了"
Else
MsgBox "本日作成されたファイルは見つかりませんでした。", vbExclamation, "通知"
End If
' --- 後片付け ---
' オブジェクトを解放する(メモリ管理の美しい作法)
Set objFile = Nothing
Set objSourceFolder = Nothing
Set objFSO = Nothing
アーキテクトの視点:コードを「堅牢」にするために
コードが書けたら、次は「なぜこう書いたのか」という設計思想を理解しましょう。これが、単なる「コピペ使い」と「エンジニア」を分ける境界線です。
1. `Option Explicit` の魔法
スクリプトの冒頭にあるこの一行。これは「変数を宣言せずに使うことを禁止する」という命令です。
例えば `targetDate` と書くべきところを `targerDate` と打ち間違えたとき、これがないとVBScriptは「新しい変数だな」と勝手に解釈して動いてしまいます。エラーを見逃す最大の原因はこれです。必ず書きましょう。
2. `DateValue` による「精度の調整」
先ほど解説した通り、`DateValue(objFile.DateCreated)` を使うことで、時刻という「ノイズ」を取り除いています。データの精度を、比較対象に合わせてコントロールする。これはデータ操作における極めて重要なスキルです。
3. 存在確認(Defensive Programming)
`If Not objFSO.FolderExists(…)`。
「もしフォルダがなかったらどうするか?」を事前に考えておくこと。これを防御的プログラミングと呼びます。プログラムがエラーで突然止まるのを防ぎ、ユーザーに分かりやすいメッセージを返す。これが「使いやすいツール」を作る秘訣です。
4. オブジェクトのライフサイクル
最後に `Set objFSO = Nothing` としています。
VBScriptは自動でメモリを管理してくれますが、大規模なシステムや長時間動かすスクリプトでは、使い終わった道具(オブジェクト)を明示的に片付ける習慣をつけておくと、メモリリークという恐ろしい現象を防ぐことができます。
まとめ
お疲れ様でした。あなたは今、単にファイルをコピーするコードを手に入れただけでなく、「日付比較のロジック」と「堅牢なコードを書くための作法」を学びました。
- FSO はファイル操作の強力なパートナー。
- 日付比較 は、時刻のノイズを排除して行う。
- エラー処理 を含めることが、プロの仕事への第一歩。
次は、このスクリプトを「タスクスケジューラ」に登録して、毎日決まった時間に自動で動くように設定してみてください。あなたのデスクに座る頃には、作業はすべて終わっている……そんな魔法のような毎日が始まりますよ。
さあ、次はどんな自動化に挑戦しますか? 応援しています!
