VBScriptを掌握する極限の知見:Scripting.Dictionaryで実現する「爆速」データ処理
こんにちは。自動化の世界へようこそ。
もしあなたが今、「数万行のログデータから重複を排除したい」あるいは「集計処理に時間がかかりすぎて、VBScriptは遅いと思っている」なら、この記事はあなたのためのものです。
VBScriptは古い言語だと言われますが、「Scripting.Dictionary」という武器を正しく扱えば、現代のスクリプト環境でも驚異的なパフォーマンスを発揮します。 マクロの記録を卒業し、真のエンジニアリングの世界へ足を踏み入れましょう。
—
1. なぜ配列ループでは「限界」が来るのか?
大量データを処理する際、多くの初心者は「配列の中に配列を入れ子にする」二重ループを書きます。
例えば、1万件のデータから重複を探す場合:
- 外側のループ: 1万回
- 内側のループ: 1万回
- 合計の計算量: 1億回(10,000 × 10,000)
これが「遅い」の正体です。計算量が爆発的に増える「O(n^2)」という罠です。これをDictionaryオブジェクトを使って「O(n)」、つまりデータ量に比例するだけの速度まで落とし込みます。
—
2. Scripting.Dictionary = 「魔法の辞書」
`Scripting.Dictionary`は、データを「キー(Key)」と「値(Item)」のペアで保持するオブジェクトです。
最大の特徴は、「キーが存在するかどうかを瞬時に判定できる」という点にあります。これを使えば、二重ループは不要です。
実践:重複排除と集計の爆速コード
以下のコードは、大量のログデータから一意なIDを抽出し、その出現回数を集計するプロのテンプレートです。
Option Explicit
‘ メイン処理:高速データ集計
Sub ProcessData()
‘ Dictionaryオブジェクトの作成
Dim dict
Set dict = CreateObject(“Scripting.Dictionary”)
‘ テストデータ(実際にはファイル読み込み等で取得)
Dim dataList, i, key
dataList = Array(“A001”, “B002”, “A001”, “C003”, “B002”, “A001”)
‘ 高速処理の核心:ループは一度だけ
For i = 0 To UBound(dataList)
key = dataList(i)
‘ 存在チェックを瞬時に行う(ここが最速のポイント)
If Not dict.Exists(key) Then
‘ 初めて登場した値は初期値1をセット
dict.Add key, 1
Else
‘ すでに存在すれば、値をインクリメント
dict(key) = dict(key) + 1
End If
Next
‘ 結果の出力
For Each key In dict.Keys
WScript.Echo “ID: ” & key & ” / 出現回数: ” & dict(key)
Next
‘ メモリ解放の習慣(重要)
Set dict = Nothing
End Sub
Call ProcessData()
—
3. なぜこれで速くなるのか?(エンジニアの視点)
Dictionaryオブジェクトは内部で「ハッシュテーブル」というアルゴリズムを使用しています。
ハッシュテーブルは、キーを数学的に計算してメモリ上の位置を特定するため、リストの中身を一つずつ探す必要がありません。「探す」のではなく「場所を当てる」ため、データが10万件になろうと、ほぼ一瞬で処理が終わります。
—
4. 陥りやすいエラーと注意点(ここがプロの差)
① `Set` を忘れる(オブジェクトの基本)
VBScriptで `Set dict = CreateObject(…)` と書く際、`Set`を忘れるとエラーになります。オブジェクト変数はメモリ上の「参照」を保持するものだからです。
② CaseSensitive(大文字小文字の区別)
Dictionaryは標準で「大文字と小文字を区別」します。
- `A001` と `a001` を同じものとして扱いたい場合は、`dict.CompareMode = 1` (TextCompare) を追加してください。
③ メモリの解放
小規模なスクリプトなら自動解放されますが、業務で何百万行も処理する場合、`Set dict = Nothing` を忘れずに行うのが、安定したシステムを構築するエンジニアの嗜みです。
—
最後に:ここをクリアすれば、あなたはもう「脱・初心者」
配列の二重ループを卒業し、`Scripting.Dictionary`を使いこなせるようになれば、あなたの自動化ツールは「待ち時間」から解放されます。
「なぜ動くのか?」を理解し、計算量を意識する。この視点を持つだけで、VBScriptだけでなく、VBAやPython、あらゆる言語のパフォーマンスを劇的に向上させることができます。
さあ、あなたの手元の「遅い処理」を、この魔法の辞書で書き換えてみてください。世界が変わるはずですよ。
