こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、「自分の手でロジックを組み上げたい」と願うあなたへ、今日はとびきり知的で実用的なテクニックをお伝えします。
ここさえクリアすれば、VBScriptの表現力はグッとプロの領域に近づきますよ。肩の力を抜いて、一緒に見ていきましょう!
—
1. なぜ今「スタック構造(LIFO)」なのか?
VBScriptといえば、Excelマクロの自動化や、ちょっとしたWindowsのバッチ処理の補佐として長年愛されてきた軽量スクリプト言語です。しかし、標準のままだと扱えるデータ構造は「配列(Array)」や「辞書(Dictionary)」くらいで、少し複雑なアルゴリズムを書こうとすると途方に暮れてしまいますよね。
特に、「直前の操作に戻る(UNDO機能)」や、フォルダ階層を深くまで潜っていく「深さ優先探索」のような処理を実装したいとき、通常の配列だとデータの追加や取り出しの管理でコードがぐちゃぐちゃになりがちです。
そこで登場するのが、.NET Frameworkが持つ `System.Collections.Stack` です。
スタック(Stack)とは?
一言で言えば、「お皿の山」です。
- Push(プッシュ): お皿を一番上に「積み上げる」
- Pop(ポップ): 一番上の「お皿を取り出す」
最後に積んだお皿が、最初に取られる。これをLIFO(Last-In, First-Out:後入れ先出し)と呼びます。この仕組みをVBScriptからスマートに呼び出し、処理履歴の逆順操作をマスターするのが今回のゴールです。
—
2. VBScriptから.NETのクラスを召喚する
VBScript単体には強力なコレクションクラスが不足していますが、Windows環境で動く強みを活かし、COMオブジェクト経由で.NETのクラスをインスタンス化することができます。
これを行う魔法の呪文がこれです。
Set stack = CreateObject(“System.Collections.Stack”)
たったこれだけで、あの強力な.NETの `Stack` オブジェクトがあなたの手元に降臨します。裏側で .NET Framework(またはCLR)がメモリ管理や動的配列の拡張をすべて引き受けてくれるため、私たちはアルゴリズムの構築だけに集中できるというわけです。
—
3. 【実践】UNDO(やり直し)機能をシミュレートするコード
百聞は一見にしかず。実際に `System.Collections.Stack` を使って、ユーザーの操作履歴を記録し、それを巻き戻す(UNDO)スクリプトを見てみましょう。
以下のコードをメモ帳に貼り付け、ファイル名を `stack_sample.vbs` として保存してダブルクリックしてみてください。
‘ =====================================================================
‘ テーマ: System.Collections.Stack を利用した LIFO 型処理履歴の管理
‘ 概要 : ユーザーの操作を記録(Push)し、直近の操作から順に取り消す(Pop)
‘ =====================================================================
Option Explicit
Sub Main
Dim stack
‘ 1. .NETのStackオブジェクトを生成
Set stack = CreateObject(“System.Collections.Stack”)
WScript.Echo “=== 操作履歴の記録(Push)開始 ===”
‘ 2. ユーザーの操作を次々とスタックに積み上げる(Push)
stack.Push “テキストファイルを作成”
WScript.Echo “実行: テキストファイルを作成”
stack.Push “文字「こんにちは」を追記”
WScript.Echo “実行: 文字「こんにちは」を追記”
stack.Push “フォントを太字に変更”
WScript.Echo “実行: フォントを太字に変更”
WScript.Echo vbCrLf & “現在のスタックの深さ(アイテム数): ” & stack.Count & vbCrLf
‘ 3. UNDO(やり直し)処理:直近の操作から逆順に取り出す(Pop)
WScript.Echo “=== UNDO(操作の取り消し)処理を開始 ===”
‘ スタックに要素がなくなるまでループ
Do While stack.Count > 0
‘ Popメソッドで取り出すと同時に、スタックから削除される
Dim lastAction
lastAction = stack.Pop()
WScript.Echo “【取り消し】 ” & lastAction & ” を元に戻しました。”
Loop
WScript.Echo vbCrLf & “すべて元に戻しました。現在のスタック数: ” & stack.Count
‘ オブジェクトの解放
Set stack = Nothing
End Sub
‘ メイン処理の実行
Main
コードのここがポイント!
1. `stack.Push “…”`: 実行した作業のログを次々と積み上げています。お皿の山の一番上に新しい情報が乗るイメージです。
2. `stack.Pop()`: このメソッドを実行すると、一番最後に積まれたデータが取得され、同時にスタックから消滅します。「フォントを太字に変更」→「文字を追記」→「ファイル作成」の順で、見事に“逆順”で取り消されているのが確認できたはずです。
3. `stack.Count`: 現在スタックにいくつデータが入っているかを瞬時に返してくれます。安全なループ処理には欠かせません。
—
4. 現場でありがち!陥りやすい罠と注意点
非常に便利な `.NET Stack` ですが、VBScriptから呼び出す際にはいくつかプロフェッショナルとしての注意点があります。
① 存在しないオブジェクトのPop(アンダーフロー)
スタックが空っぽ(`Count = 0`)の状態で `stack.Pop()` を呼び出すと、容赦なくスクリプトがエラー(例外)でクラッシュします。
- 対策: 必ず `Do While stack.Count > 0` や `If stack.Count > 0 Then` で残数を担保してからPopするようにしましょう。
② 格納するデータの型に注意
VBScriptの変数は基本的に `Variant` 型です。文字列、数値、オブジェクトなどを何でも `Push` できてしまいますが、取り出すとき(`Pop`)にどのようなデータが入っているか意識しておかないと、後続の処理で型ミスマッチエラーを引き起こします。複雑な構造を扱う場合は、JSON文字列にシリアライズしてからPushするなどの工夫も現場では有効です。
—
おわりに
お疲れ様でした!
今回学んだ `System.Collections.Stack` を使ったLIFO構造の制御は、単なるテキストの操作だけでなく、ファイルシステムを再帰的に巡回するスクリプトや、複雑な業務フローのロールバック処理など、実務のあらゆる場面であなたを助けてくれます。
「VBScriptって古いだけの言語じゃないんだ、こんなにスマートな書き方もできるんだ」と実感してもらえたら嬉しいです。
ここをクリアしたあなたなら、もうマクロの記録の枠を超えた「本物の自動化エンジニア」の第一歩を踏み出しています。ぜひ、日々の業務の自動化にこの知見を役立ててくださいね!
