【入門編】【高速データ処理】Scripting.Dictionary を活用した重複データの高速抽出と連想配列集計 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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、あらゆる言語のパフォーマンスを劇的に向上させることができます。

さあ、あなたの手元の「遅い処理」を、この魔法の辞書で書き換えてみてください。世界が変わるはずですよ。

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