VBScriptを「爆速」にする極意:FSOと文字列連結の最適化テクニック
こんにちは。業務自動化の世界へようこそ。
VBScriptは一見、枯れた古い技術のように思えるかもしれません。しかし、そのシンプルさゆえに「書き方一つで劇的にパフォーマンスが変わる」という、エンジニアとしての基礎体力が試される言語でもあります。
今回は、大量のファイルを扱う際に、多くの初心者が陥る「重いスクリプト」を「爆速スクリプト」へと進化させるための、FSO(FileSystemObject)の最適化と文字列連結の極意を伝授します。
—
1. なぜ「CreateObject」をループに入れてはいけないのか?
まず、初心者が最もやりがちなアンチパターンを見てみましょう。
‘ 【アンチパターン】ループ内で毎回FSOを生成
For i = 1 To 1000
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set file = fso.OpenTextFile(“C:\test\” & i & “.txt”)
‘ …処理…
Set fso = Nothing ‘ 生成と破棄の繰り返し
Next
なぜこれが「罪」なのか?
`CreateObject` は、OSに対して「新しいオブジェクトをメモリ上に作ってくれ」と頼む非常に重い命令です。1回なら無視できますが、1000回繰り返せばOSは悲鳴を上げます。インスタンス生成は、ループの外で一度だけ行うのが鉄則です。
改善案:インスタンスの極小化
‘ 【ベストプラクティス】
Set fso = CreateObject(“Scripting.FileSystemObject”) ‘ ループの外で1回だけ生成
For i = 1 To 1000
Set file = fso.OpenTextFile(“C:\test\” & i & “.txt”)
‘ …処理…
Next
Set fso = Nothing ‘ 最後に一度だけ解放
これだけで、実行速度は劇的に向上します。メモリの浪費も防ぎ、スクリプト全体の安定性が段違いになります。
—
2. 文字列結合の落とし穴:&演算子の罠
次に、テキスト処理で多くの人が犯すミスが「文字列の結合」です。
‘ 【アンチパターン】&で結合し続ける
result = “”
For i = 1 To 10000
result = result & “行データ” & vbCrLf
Next
なぜ遅いのか?
VBScriptにおいて `&` で文字列を結合するたび、メモリ上では「古い文字列を捨てて、新しい巨大なメモリ領域を確保し、データをコピーし直す」という作業が発生します。10,000回繰り返すと、メモリの確保と破棄が膨大に発生し、後半になるほどスクリプトが止まったかのように遅くなります。
解決策:配列とJoin関数の魔法
VBScriptの隠れた必殺技が `Join` 関数です。データを一度配列に溜め込み、最後に一気に結合することで、メモリ確保の回数を最小限に抑えます。
‘ 【ベストプラクティス】配列とJoinで高速化
Dim arr(10000) ‘ 事前にサイズを確保(あるいはReDimで動的確保)
For i = 0 To 10000
arr(i) = “行データ”
Next
‘ 最後に一気に結合!これが爆速の秘訣
result = Join(arr, vbCrLf)
—
3. 現場で使える「爆速ファイル処理」テンプレート
これらを組み合わせた、実務でそのまま使えるコード例です。大量のログファイルを読み込んで一つのテキストにまとめるような処理を想定しています。
Option Explicit
‘ 速度とメモリ効率を最大化する設計
Dim fso, folder, file, targetFile
Dim fileList, i
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(“C:\Logs”)
‘ 配列を準備(ファイル数が多い場合はReDim Preserveを利用)
ReDim fileContents(folder.Files.Count – 1)
i = 0
For Each file In folder.Files
‘ ファイルの内容を配列に格納
fileContents(i) = fso.OpenTextFile(file.Path).ReadAll
i = i + 1
Next
‘ Joinで結合して一気に書き出し
Dim finalResult
finalResult = Join(fileContents, vbCrLf & “—区切り—” & vbCrLf)
‘ ファイル書き出し
Set targetFile = fso.CreateTextFile(“C:\Logs\Summary.txt”, True)
targetFile.Write(finalResult)
targetFile.Close
‘ 後処理
Set targetFile = Nothing
Set folder = Nothing
Set fso = Nothing
WScript.Echo “処理完了!”
—
まとめ:エンジニアとして成長するために
今回紹介したテクニックをまとめます。
1. オブジェクトの生成はループの外で: OSに余計な負荷をかけない。
2. 文字列結合は `Join` で: メモリの再割り当てを最小化する。
3. `Option Explicit` を必ず書く: 変数の宣言を強制し、バグを未然に防ぐ。
「動けばいい」というコードから、「速く、美しく、壊れにくい」コードへ。この意識の差が、あなたを単なる「マクロ記録ユーザー」から「業務自動化のアーキテクト」へと変えてくれます。
この壁さえ越えてしまえば、VBScriptはあなたの強力な武器になります。ぜひ現場で試してみてください。応援しています!
