業務自動化の深淵へ:VBScriptによる「究極のドロップハンドラー」設計術
業務自動化の世界において、VBScriptは「レガシー」と揶揄されることもある。だが、OSにネイティブで、インストール不要、かつ軽量。この特性は、管理権限が厳格なエンタープライズ環境において、今なお最強の武器だ。
今日は、無数のファイルをスクリプトに投げ込み、瞬時に分類・処理する「堅牢なドロップハンドラー」の構築法を伝授する。ただ動くだけのコードではない。「何が起きてもクラッシュせず、メンテナンス可能な」設計思想を叩き込む。
—
1. なぜ「雑なループ」が死を招くのか
初心者が書くスクリプトの多くは、`WScript.Arguments`を単純に`For Each`で回し、その場で処理を実行する。これは「地雷」だ。
- エラーの伝播: 1つのファイルの処理で例外が発生すると、残りの全ファイルが処理されない。
- パスの罠: ファイルパスにスペースが含まれる場合、シェル環境によっては引数の解釈がズレる。
- 非同期の無知: ファイルシステムへのアクセスは重い。GUIなしで走るWSHは、処理の進捗が見えないとユーザーに「フリーズした」と誤認される。
これらを排除し、「解析フェーズ」と「実行フェーズ」を分離する。これがプロの設計だ。
—
2. 堅牢なプロトタイプコード
このコードは、ファイルパスのサニタイズと、拡張子に基づいた振り分け処理を分離した、プロダクション(本番)環境対応のテンプレートだ。
Option Explicit
‘ ———————————————————
‘ メイン処理:ドラッグ&ドロップの入り口
‘ ———————————————————
Dim objFSO, objArg, argPath
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ 引数がなければ終了
If WScript.Arguments.Count = 0 Then
WScript.Echo “ファイルをドロップしてください。”
WScript.Quit
End If
‘ 1. 解析・振り分けフェーズ
For Each argPath In WScript.Arguments
If objFSO.FileExists(argPath) Then
ProcessFile argPath, objFSO
ElseIf objFSO.FolderExists(argPath) Then
WScript.Echo “フォルダはスキップまたは再帰処理: ” & argPath
End If
Next
‘ 2. 個別処理フェーズ(保守性を高めるために独立させる)
Sub ProcessFile(strPath, fso)
On Error Resume Next ‘ 個別の失敗が全体を止めるのを防ぐ
Dim ext
ext = LCase(fso.GetExtensionName(strPath))
Select Case ext
Case “xlsx”, “xls”
‘ Excel関連のロジック
WScript.Echo “Excelファイルを処理中: ” & fso.GetFileName(strPath)
Case “txt”, “csv”
‘ テキスト関連のロジック
WScript.Echo “テキストファイルを処理中: ” & fso.GetFileName(strPath)
Case Else
WScript.Echo “対象外のファイル: ” & strPath
End Select
If Err.Number <> 0 Then
WScript.Echo “エラー発生 [” & strPath & “]: ” & Err.Description
Err.Clear
End If
On Error GoTo 0
End Sub
Set objFSO = Nothing
—
3. この設計が「現場」で生き残る理由
① `On Error Resume Next` の正しい使い方
VBScriptにおいてエラー制御は必須だが、グローバルに適用してはいけない。上記の通り、「特定の関数内のみ」でガードし、処理が終わればすぐに`On Error GoTo 0`で標準の挙動に戻す。これがバグの温床を防ぐ鉄則だ。
② ファイルシステムの抽象化
`Scripting.FileSystemObject (FSO)` は、パスの結合や拡張子の取得において極めて優秀だ。手動で文字列操作(`InStr`や`Right`)を行うのは、パスに日本語や特殊文字が含まれる場合、致命的なバグを生む。FSOに任せろ。
③ 拡張子判定の正規化
`LCase(fso.GetExtensionName(strPath))`。この一行が甘いと、`FILE.XLSX`と`file.xlsx`を別物として扱ってしまう。常に小文字に統一して比較する癖をつけろ。
—
4. 現場のリーダーからの助言:データベース連携の注意点
もしこのツールからデータベースを叩く場合、「コネクションの使い回し」に注意せよ。
ループ内で都度`CreateObject(“ADODB.Connection”)`を生成・破棄するのはパフォーマンス的に最悪だ。
- 正解: コネクションをループの外で1回だけ開き、トランザクション処理で一括コミットする。
- 警告: 1ファイル1トランザクションにすると、ファイル数が100を超えた瞬間にDBのI/Oでパンクする。
—
最後に:自動化の真髄
VBScriptは古い。しかし、OSの深部を操るには、今なお最も直感的で「現場に近い」言語だ。今回紹介した「解析と実行の分離」というアーキテクチャは、言語が何であれ、自動化ツールを作る上での共通言語である。
ドロップされたファイルの数だけ、あなたの業務が楽になる。今日学んだ「堅牢な設計」を武器に、誰にも壊されない自動化システムを構築してほしい。
健闘を祈る。
