こんにちは!VBScriptの世界へようこそ。
業務自動化の現場で、ExcelマクロやWSH(Windows Script Host)を使ったバッチ処理を書いていると、必ずと言っていいほど直面する壁があります。
そう、「配列のソート(並べ替え)」です。
VBScriptの標準機能(`ReDim`や固定配列)だけでデータを並べ替えようとすると、バブルソートなどのアルゴリズムを自分でゼロから実装するか、二重ループをガリガリ回す泥臭いコードを書かなくてはなりません。データが数千件を超えた日には、処理が終わるのをコーヒーを飲みながら待つはめになります。
「もっとスマートに、もっと速く、配列を並べ替えたい……!」
そんな悩みを一撃で解決するのが、今回伝授する `.NETの `ArrayList` をVBScriptから呼び出すテクニック` です。ここをクリアすれば、あなたのVBScriptスキルは間違いなく一つ上のステージに到達しますよ。さあ、一緒に扉を開けましょう!
—
1. なぜVBScript単体でのソートはツラいのか?
VBScriptは、1990年代生まれの非常に軽量でレトロなスクリプト言語です。OSの標準機能だけで動く手軽さがある一方で、モダンなプログラミング言語にあるような「強力なデータ構造や便利メソッド」が標準ではほとんど用意されていません。
例えば、VBScriptの標準配列をソートしようとするとこうなります:
- 自力で比較ロジックを書く(比較とスワップのループ処理)
- コードが長くなり、メンテナンス性が最悪になる
- データ量が増えると実行速度が劇的に遅くなる
ここで登場するのが、Windowsに標準搭載されている .NET Framework(COMコンポーネント) の力です。実は、VBScriptから `CreateObject(“System.Collections.ArrayList”)` を呼び出すだけで、Microsoftが最適化した超高速なデータ構造をそのまま借用できてしまうのです。
—
2. 実践!ArrayListを使った超高速ソートの全貌
百聞は一見に如かず。まずは、バラバラに並んだ文字列や数値を、わずか数行で昇順・降順にソートする実用スクリプトを見てみましょう。
デスクトップにメモ帳を開いて、以下のコードを `sort_sample.vbs` という名前で保存してみてください。
‘ ==============================================================================
‘ 【テーマ】System.Collections.ArrayList を用いた超高速データソート
‘ 【解説】VBScriptの弱点である配列操作を.NETのパワーで補う実用サンプル
‘ ==============================================================================
Option Explicit
Dim objArrayList, i
Dim rawData
‘ 1. ArrayList オブジェクトを生成する
‘ ※Windows環境(.NET Framework 2.0以上)であれば追加インストール不要で動作します
Set objArrayList = CreateObject(“System.Collections.ArrayList”)
‘ 2. データを格納する(バラバラの果物名)
objArrayList.Add “Orange”
objArrayList.Add “Apple”
objArrayList.Add “Banana”
objArrayList.Add “Cherry”
objArrayList.Add “Melon”
WScript.Echo “— 【1】元のデータ —”
For i = 0 to objArrayList.Count – 1
WScript.Echo objArrayList.Item(i)
Next
‘ 3. 昇順(AからZ、あいうえお順)にソート
objArrayList.Sort()
WScript.Echo “— 【2】昇順ソート結果 —”
For i = 0 to objArrayList.Count – 1
WScript.Echo objArrayList.Item(i)
Next
‘ 4. 降順(ZからA、逆順)にソート
‘ ※ArrayListにはReverseメソッドもあるため、Sortした後に反転させます
objArrayList.Reverse()
WScript.Echo “— 【3】降順ソート結果 —”
For i = 0 to objArrayList.Count – 1
WScript.Echo objArrayList.Item(i)
Next
‘ 5. オブジェクトの解放(メモリ管理の基本)
Set objArrayList = Nothing
WScript.Echo “すべての処理が正常に完了しました。”
—
3. コードの急所とエンジニア的解説
ここからは、チーフアーキテクトの視点から、このコードの重要なポイントを紐解いていきます。
① `CreateObject(“System.Collections.ArrayList”)` の魔法
VBScriptからOS内部の.NETクラスライブラリを直接召喚している瞬間です。COM相互運用(COM Interop)という仕組みを使い、VBScriptからVB.NETやC#の世界のオブジェクトを操作しています。これにより、VBScriptが本来持っていない `.Add` や `.Sort` といった強力なメソッドが使えるようになります。
② メモリとオブジェクトのライフサイクル
プログラミング初心者が忘れがちなのが、使い終わったオブジェクトの解放です。スクリプトの最後にある `Set objArrayList = Nothing` は非常に重要です。
これを記述することで、OS側(RAM)に確保された.NETのメモリ領域が速やかに解放され、メモリリークを防ぐことができます。プロの現場では「借りたものは綺麗にして返す」が鉄則です。
③ 昇順と降順のスマートな切り替え
ArrayListの `.Sort()` メソッドはデフォルトで「昇順」に並べ替えてくれます。では降順にしたい場合はどうするか?
実は、一度 `.Sort()` で綺麗に昇順に並べたあと、`.Reverse()` メソッドを呼び出すだけで、綺麗に逆順(降順)にひっくり返すことができます。これが非常にエレガントで高速です。
—
4. 現場でよくある「ハマりどころ」と注意点
この `ArrayList` ですが、万能であるがゆえにいくつか気をつけておくべきポイントがあります。現場でエラーに泣かされないよう、事前に頭に入れておきましょう。
注意点1: 型の混在(文字列と数値の比較)に注意
ArrayListには、文字列でも数値でも、どんなデータでも放り込むことができます。しかし、「数値」と「文字列」が混ざった状態で `.Sort()` を実行すると、環境によって型不一致エラー(型が一致しません)が発生することがあります。
- 対策: ソートするデータは、必ず「すべて数値」または「すべて文字列」に統一してから `.Add` しましょう。
注意点2: 環境依存(.NET Frameworkの有無)
現代のWindows環境(Windows 7, 8, 10, 11, Windows Serverなど)であれば、基本コンポーネントとして.NET Framework 2.0/3.5/4.xが稼働しているため、基本的には動きませんということはありません。ただし、極端にセキュリティが厳しく制限されたレガシー環境や特殊な仮想デスクトップ環境では、COMコンポーネントの生成自体がブロックされる場合があります。その際はエラーハンドリング(`On Error Resume Next` 等)を適切に組み込みましょう。
—
まとめ:VBScriptの限界を突破しよう
今回は、.NETの `System.Collections.ArrayList` を使った超高速データソートについて解説しました。
- VBScriptの標準機能でのソートは労力がかかる
- `CreateObject(“System.Collections.ArrayList”)` を使えば一瞬で解決する
- `.Sort()` で昇順、続けて `.Reverse()` で降順が自由自在
- 使い終わったら `Set … = Nothing` でメモリを解放する
ここをクリアすれば、VBScriptで大量のCSVデータを扱う処理や、ログファイルを日付順・名前順に整理する自動化スクリプトの作成スピードが何倍にも跳ね上がります。
「マクロの記録」や「決まった手順のコピペ」から一歩進んで、こうしたシステム連携の知見を身につければ、あなたの業務自動化エンジニアとしての幅は一気に広がりますよ。
それでは、次の自動化の現場でお会いしましょう!バッチリ使いこなしてくださいね!
