【実務・中級編】【ドラッグ&ドロップ応用】WScript.Arguments を用いた複数ファイル・フォルダ同時ドロップの解析と自動振り分け – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

業務自動化の深淵へ: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の深部を操るには、今なお最も直感的で「現場に近い」言語だ。今回紹介した「解析と実行の分離」というアーキテクチャは、言語が何であれ、自動化ツールを作る上での共通言語である。

ドロップされたファイルの数だけ、あなたの業務が楽になる。今日学んだ「堅牢な設計」を武器に、誰にも壊されない自動化システムを構築してほしい。

健闘を祈る。

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