こんにちは!現場でバリバリ自動化を進めていると、「エクセルのマクロだけじゃ物足りないな」「エクセルを開かずに、ファイルをポイッと放り込むだけで処理が完結するツールを作りたいな」という壁にぶつかることありませんか?
そんな時に最高に頼りになるのが、Windows標準のVBScript(WSH)です。
今回は、デスクトップにあるスクリプトのアイコンへ、ファイルやフォルダを「ドラッグ&ドロップ」するだけで、自動で一括処理してくれる魔法のような仕組みをマスターしましょう!
ここさえクリアすれば、あなたの自動化スキルは間違いなくワンランク上のステージに到達しますよ。
—
1. なぜ「ドラッグ&ドロップ自動化」なのか?
日常業務でこんな面倒くささを感じていませんか?
- 「毎朝、大量のCSVファイルを特定のフォルダに移動しなきゃいけない…」
- 「リネームしたいファイルが50個あって、1つずつ手で書き換えるなんて無理…」
- 「黒い画面(コマンドプロンプト)にパスを手入力するのはタイポが怖い…」
これらを解決するのが、WScript.Arguments(ダブリュースクリプト・アーグメンツ)というオブジェクトです。
スクリプトのアイコンにファイルをつまんで「ポイッ」と放り込むと、Windowsは「このファイルを処理してね」という合図(引数)をVBScriptにこっそり渡してくれます。あとはVBScript側で料理するだけ。エクセルを起動する必要すらないので、動作も爆速です。
—
2. 仕組みの核心:`WScript.Arguments` を覗いてみよう
まずは、ドラッグ&ドロップされたファイルが、VBScriptの内部でどう扱われているのかを見てみましょう。
以下のコードをメモ帳に貼り付けて、拡張子を `.vbs` (例: `test.vbs`)で保存してみてください。
‘ =================================================================
‘ ファイル名: CheckArgs.vbs
‘ 概要: ドラッグ&ドロップされたファイルの数とパスを表示するテスト
‘ =================================================================
Option Explicit
Dim argCount, i
‘ 引数の総数を取得する
argCount = WScript.Arguments.Count
If argCount = 0 Then
MsgBox “ファイルがドラッグ&ドロップされていません。”, vbExclamation, “通知”
WScript.Quit
End If
MsgBox argCount & “個のファイルがドロップされました。”, vbInformation, “成功”
‘ 渡されたファイルの数だけループしてパスを表示する
For i = 0 To argCount – 1
MsgBox i + 1 & “番目のファイル: ” & vbCrLf & WScript.Arguments(i), vbInformation, “ファイルパス”
Next
💡 ここがポイント!
- `WScript.Arguments.Count`: ドロップされた(あるいはコマンドラインから渡された)ファイルの総数を返します。
- `WScript.Arguments(i)`: 配列と同じ要領で、0番目から順に「ファイルのフルパス」を取得できます(VBScriptのコレクションは0始まりです)。
この `test.vbs` をデスクトップに置いて、適当なファイルをいくつか選んで同時にドラッグ&ドロップしてみてください。ファイルパスが順番にポップアップ表示されましたよね? これがドラッグ&ドロップ自動化のすべての土台となります。
—
3. 【実践】複数ファイルを一括処理する実用スクリプト
「ファイルのパスが取れるようになったのは分かったけど、実務ではどう使うの?」という声にお応えして、今回は「ドロップされたテキストファイル(.txt)の文字コードや内容を判定し、ログに書き出す」という実用的なスクリプトを書いてみましょう。
現場でそのままコピペしてカスタマイズできるように、丁寧なコメントを入れています。
‘ =================================================================
‘ スクリプト名: BatchFileProcessor.vbs
‘ 概要: ドロップされた複数ファイルを受け取り、種類ごとに仕分けて処理する
‘ =================================================================
Option Explicit
‘ エラーハンドリングの有効化(現場の必須テクニック)
On Error Resume Next
Dim objArgs, fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set objArgs = WScript.Arguments
‘ 1. ガード節:何もドロップされていない場合の処理
If objArgs.Count = 0 Then
MsgBox “処理したいファイルをこのスクリプトアイコンにドラッグ&ドロップしてください。”, _
vbExclamation, “ファイル未指定”
WScript.Quit
End If
Dim fileItem, processedCount, targetPath
processedCount = 0
‘ 2. メインループ:ドロップされたファイルを1つずつ処理
For Each targetPath In objArgs
‘ ファイルが存在するか、かつファイルであるかチェック
If fso.FileExists(targetPath) Then
‘ 拡張子を取得して小文字に統一
Dim ext
ext = LCase(fso.GetExtensionName(targetPath))
‘ 拡張子に応じた条件分岐
Select Case ext
Case “txt”, “csv”
‘ — テキスト・CSVファイルの場合の処理 —
‘ ここに実際の業務処理を書きます(例としてログ出力)
Call ProcessTextFile(targetPath)
processedCount = processedCount + 1
Case “xlsx”, “xls”
‘ — エクセルファイルの場合の処理 —
MsgBox “Excelファイルは現在サポートしていません: ” & fso.GetFileName(targetPath), _
vbExclamation, “スキップ”
Case Else
‘ — その他のファイル —
‘ 何もしないか、ログに残す
End Select
End If
Next
‘ 3. 終了通知
MsgBox “すべての処理が完了しました。” & vbCrLf & _
“処理成功ファイル数: ” & processedCount & “件”, _
vbInformation, “処理完了”
‘ オブジェクトの解放
Set fso = Nothing
WScript.Quit
‘ —————————————————————–
‘ 関数名: ProcessTextFile
‘ 概要: テキストファイルを読み込んで何らかの処理を行う(サブプロシージャ)
‘ —————————————————————–
Sub ProcessTextFile(filePath)
Dim fileObj, fileName
fileName = CreateObject(“Scripting.FileSystemObject”).GetFileName(filePath)
‘ 実務ではここでFSOを使ったテキスト読み込みや、
‘ Shellオブジェクトを使った別プログラムの起動などを行います。
‘ 例: WScript.Echo “処理中: ” & fileName
End Sub
—
4. 初学者が絶対にハマる「3大トラップ」と回避策
VBScriptでファイル処理を自動化する際、多くの人が以下の罠にハマります。先回りして知っておきましょう。
トラップ1: パスにスペース(空白)が含まれている時の誤動作
Windowsのファイルパスには `C:\My Folder\report.txt` のようにスペースが入ることがあります。
- NGな書き方: コマンドプロンプト等から引数を手動でパースしようとすると、スペースで文字が切れてしまいます。
- 救世主: 今回紹介した `WScript.Arguments` を使っていれば、Windowsが自動的に「1つのパス」として安全に管理してくれるため、スペースが含まれていても全く問題ありません!安心してそのまま使ってください。
トラップ2: フォルダがドロップされたときの対策漏れ
ユーザーが「ファイル」ではなく「フォルダ」を間違えてドロップすることがあります。
- 対策: スクリプト内で `fso.FileExists(path)` なのか `fso.FolderExists(path)` なのかを必ず判定するロジックを組み込みましょう。フォルダ内の全ファイルをループ処理したい場合は、`Folder.Files` コレクションを使えば一網打尽にできます。
トラップ3: ダブルクリックで実行したときの「引数ゼロエラー」
ドラッグ&ドロップではなく、うっかりスクリプトを「ダブルクリック」して起動してしまうことがあります。
- 対策: 先ほどのコードにも入れた `If objArgs.Count = 0 Then … WScript.Quit` というガード節を必ず用意してください。これがないと、後続の処理で「オブジェクトが見つかりません」などの意図しないエラー(Runtime Error)を引き起こしてしまいます。
—
まとめ:ここをクリアすればVBScriptの基本はバッチリ!
今回は、`WScript.Arguments` を使ったファイル・フォルダのドラッグ&ドロップ自動化について解説しました。
1. `WScript.Arguments.Count` でドロップされたファイルの数を知る
2. `WScript.Arguments(i)` でそれぞれの安全なフルパスを受け取る
3. ガード節を置いて、ダブルクリック誤爆や空実行を防ぐ
この3つさえ押さえておけば、日常のちょっとしたファイル整理やデータ変換の自動化ツールは自由自在に作れるようになります。社内の定型業務をサクッと効率化して、まわりの同僚をアッと言わせちゃいましょう!
VBScriptの基礎は、ここからさらにWMIやShellオブジェクトの活用へと広がっていきます。一歩ずつ、確実にマスターしていきましょうね。応援しています!
