こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でシステムをコントロールしたいあなたへ。今回は、現場で即戦力となる「タスク処理パイプライン」の構築方法を伝授します。
ここをクリアすれば、単なる「言われた通りに動くスクリプト」から卒業し、「大量のデータを美しく、秩序立ててさばくエンジニア」の仲間入りです。一緒に本質をマスターしていきましょう!
—
1. なぜ「キュー構造(FIFO)」が必要なのか?
実務でこんな課題にぶつかったことはありませんか?
- 「フォルダにある数百個のファイルを、古い順に1つずつ処理したい」
- 「APIへのリクエストが同時だとサーバーが悲鳴を上げるから、1件ずつ順番に流したい」
人間でも、役所の窓口で「並んだ順番(先入れ先出し=FIFO: First-In, First-Out)」に処理してもらうのが一番公平で混乱がありませんよね。プログラムの世界でも全く同じです。
VBScript標準の配列(Array)は、途中のデータを削除して詰め直すのが非常に面倒です。そこで登場するのが、.NET Frameworkが持つ強力なコンポーネント `System.Collections.Queue` です。
—
2. 図解:キュー(Queue)のイメージ
データの流れは、まるで「トンネルを通過する列車」です。
[新しいタスク]
↓
( Enqueue ) ← トンネルの後ろから追加!
▼
+———————————–+
| [任务3] -> [任务2] -> [任务1] | ← Queue (キュー)
+———————————–+
▼
( Dequeue ) ← トンネルの前から取り出す!(一番古いやつ)
↓
[処理実行!]
- Enqueue(エンキュー): 列の「最後尾」に新しいタスクを追加する。
- Dequeue(デキュー): 列の「最先頭」からタスクを取り出し、列から削除する。
この2つの基本操作だけで、どんなに大量のデータも綺麗な「順番待ちの列」を作ることができます。
—
3. 実践!堅牢なタスクパイプラインスクリプト
それでは、実際に動くコードを見てみましょう。
メモ帳を開いて、以下のコードを `task_pipeline.vbs` という名前で保存してください。(文字コードは `Shift-JIS` または `UTF-8` がおすすめです)
‘ ==============================================================================
‘ スクリプト名: task_pipeline.vbs
‘ 概要: System.Collections.Queue を利用した FIFO 型タスク処理パイプライン
‘ ==============================================================================
Option Explicit
Sub Main
Dim objQueue, taskItem
WScript.Echo “=== タスクパイプライン処理を開始します ===”
‘ 1. .NETのQueueオブジェクトを生成する
‘ ※VBScriptの枠を超えた、COM経由の強力な .NET機能の呼び出しです
Set objQueue = WScript.CreateObject(“System.Collections.Queue”)
‘ 2. タスクを順番に投入(Enqueue)する
‘ 実務では、ここでファイルパスや顧客IDなどをガンガン詰め込みます
objQueue.Enqueue “顧客データ_A社.csv”
objQueue.Enqueue “顧客データ_B社.csv”
objQueue.Enqueue “顧客データ_C社.csv”
objQueue.Enqueue “顧客データ_D社.csv”
WScript.Echo “現在の待機タスク数: ” & objQueue.Count & ” 件” & vbCrLf
‘ 3. キューが空になるまで、順番に取り出して処理(Dequeue)する
‘ While…Wend ループで安全に全件処理します
Do While objQueue.Count > 0
‘ 先頭のデータを取得し、同時にキューから削除する
taskItem = objQueue.Dequeue
‘ 実際の処理(ここでは擬似的にWScript.Echoで代行)
Call ProcessTask(taskItem)
‘ デバッグ用:残りのタスク数を表示
‘ WScript.Echo ” (残りタスク: ” & objQueue.Count & ” 件)”
Loop
WScript.Echo vbCrLf & “=== すべてのタスクが正常に完了しました ===”
‘ 4. オブジェクトの解放(メモリ管理の基本)
Set objQueue = Nothing
End Sub
‘ ——————————————————————————
‘ 個別のタスクを実行する関数
‘ ——————————————————————————
Sub ProcessTask(ByVal targetName)
WScript.Echo “[処理中] ” & targetName & ” をデータベースにインポートしています…”
‘ 【ここに実際の業務ロジックを書きます】
‘ 例: Excelを開く、ファイルをリネームする、APIを叩くなど
‘ 擬似的なウェイト(処理の重みを表現)
WScript.Sleep 1000 ‘ 1秒待機
WScript.Echo “[完了] ” & targetName
End Sub
‘ メイン処理の実行
Call Main
—
4. コードの重要ポイントと「知見」
① `Option Explicit` はエンジニアの生命線
ファイルの先頭にあるこの1行、絶対に省かないでください。「変数の宣言忘れ」によるタイポ(打ち間違い)で引き起こされる数時間のデバッグ地獄を未然に防いでくれます。プログラマとしての最初の儀式だと思って必ず書きましょう。
② `.CreateObject(“System.Collections.Queue”)` の魔法
VBScript単体では高度なデータ構造を持っていませんが、Windowsに標準搭載されている.NET Framework(COM相互運用)の力を借りることで、一瞬で高速なQueueオブジェクトが手に入ります。これがVBScriptを極める醍醐味です。
③ ループの終了条件 `objQueue.Count > 0`
「配列の要素数がいくつだっけ…」と `UBound` で悩む必要はもうありません。`.Count` プロパティが常に正確な残数を教えてくれます。処理が終わるたびに `.Count` が減っていくため、`Do While` と非常に相性が良いのです。
—
5. 初心者が陥りやすい罠とエラー対策
現場でこのコードを応用する際、よくある落とし穴をいくつか紹介しておきます。
- エラー:「オブジェクトはプロパティまたはメソッドをサポートしていません: ‘System.Collections.Queue’」
- 原因: お使いのWindows環境に該当する.NETのバージョンが入っていない、または32bit/64bitの実行環境のミスマッチが起きている可能性があります。通常のWindows 10 / 11であれば問題なく動作します。
- ループの無限地獄
- `Dequeue` を忘れると、`objQueue.Count` が減らないため無限ループに陥ります。必ず「取り出す処理」とセットで使いましょう。
—
まとめ
お疲れ様でした!
今回学んだ `System.Collections.Queue` を利用した FIFO パイプライン は、ファイル一括処理、ログ解析、Webスクレイピングの巡回など、あらゆる自動化の現場で応用できる「黄金パターン」です。
ここをクリアしたあなたなら、もう「ただのVBScript初心者」ではありません。
ぜひ自分の業務の自動化リストを開いて、「この処理、キュー構造に置き換えられないか?」と考えてみてください。世界が変わって見えるはずですよ。それでは、次のステップへ進みましょう!
