VBScriptを「ただのスクリプト」で終わらせない。Class構文で手に入れる真の制御力
こんにちは。現場で長年、複雑怪奇なレガシーシステムを自動化してきたエンジニアです。
VBScriptと聞くと、「簡単な定型処理を書くための道具」と思っていませんか?もしあなたが「コードが長くなると、どこで何をしているか分からなくなる」「変数名が衝突してパニックになる」という悩みを抱えているなら、今日がその脱却の日です。
今回は、VBScriptの真髄である「Class構文」を掘り下げます。これをマスターすれば、あなたは単なる「スクリプト書き」から、堅牢なシステムを設計する「アーキテクト」へと一歩踏み出せます。
—
1. なぜ「Class(クラス)」が必要なのか?
初心者のうちは、変数をグローバル(スクリプトの頭)で宣言し、プロシージャ(SubやFunction)でゴリゴリ書き換える手法が楽に思えます。しかし、コードが数百行を超えた瞬間、それは「スパゲッティコード」という名の地獄に変わります。
Classを使う最大の目的は、「データ」と「そのデータを操作するルール」をひとまとめにする(カプセル化)ことです。
- 隠す(Private): 外部から勝手にいじられたくない設定値は隠す。
- 見せる(Public): 操作に必要な窓口だけを公開する。
これだけで、バグの温床である「意図しない変数の書き換え」を物理的に防ぐことができるのです。
—
2. クラスの基本構造:VBScriptの設計図
まずは、最もシンプルなクラスの形を見てみましょう。
‘ クラス定義の開始
Class DatabaseConnector
‘ 外部からは見えない隠し変数(フィールド)
Private m_ConnectionString
‘ インスタンス生成時に自動実行されるイベント
Private Sub Class_Initialize()
m_ConnectionString = “Initial Catalog=Default;Server=Localhost;”
WScript.Echo “クラスがメモリにロードされました。”
End Sub
‘ インスタンス破棄時に自動実行されるイベント
Private Sub Class_Terminate()
WScript.Echo “クラスの処理が終了し、メモリが解放されます。”
End Sub
‘ Property Get: 外部から値を取得するための窓口
Public Property Get ConnectionString()
ConnectionString = m_ConnectionString
End Property
‘ Property Let: 外部から値を設定するための窓口(バリデーションが可能)
Public Property Let ConnectionString(strValue)
If strValue = “” Then
WScript.Echo “警告: 空の接続文字列は設定できません。”
Else
m_ConnectionString = strValue
End If
End Property
End Class
‘ — 実行部 —
Dim db : Set db = New DatabaseConnector
db.ConnectionString = “Server=Production;DB=Sales;” ‘ Letが呼ばれる
WScript.Echo “現在の設定: ” & db.ConnectionString ‘ Getが呼ばれる
Set db = Nothing ‘ Terminateが呼ばれる
ここがポイント!
1. `Class_Initialize` / `Class_Terminate`: オブジェクトのライフサイクルを制御する鍵です。ファイルのオープン/クローズや、ログの開始/終了処理をここに書くことで、「処理のやり忘れ」をゼロにできます。
2. `Property Let/Get`: 変数に直接触らせず、窓口を通すことで「不正な値が代入されるのを防ぐ」というガードレールを敷けるようになります。
—
3. 現場で陥りやすいエラーと回避策
VBScriptでクラスを扱う際、初心者が必ずと言っていいほどハマる罠があります。
罠その1:`Set` を忘れる
VBScriptでは、オブジェクトを代入する際に必ず `Set` キーワードが必要です。
- NG: `db = New DatabaseConnector`
- OK: `Set db = New DatabaseConnector`
理由: VBScriptにとって、オブジェクトと通常の数値/文字列は扱いが根本的に異なるからです。
罠その2:循環参照によるメモリリーク
クラスAがクラスBを参照し、クラスBもクラスAを参照すると、`Class_Terminate` が永遠に呼ばれず、メモリが解放されません。
- 対策: 複雑な構造を作る際は、`Set 参照先 = Nothing` を明示的に呼び出す癖をつけましょう。
—
4. ステップアップのためのアドバイス
クラスを使い始めると、あなたのコードは劇的に整理されます。例えば「ファイル操作クラス」「メール送信クラス」「ログ出力クラス」のように機能を部品化しておけば、別のプロジェクトでもそのままコピペして使い回せるようになります。
ここをクリアすれば、あなたはもうマクロの記録をポチポチ押すだけのユーザーではありません。VBScriptの裏側にある「オブジェクト指向」という強力な武器を手に入れたのです。
今日の課題:
今書いているスクリプトの中で、「何度も使い回している変数」や「セットで動かしているプロシージャ」を探してみてください。それを一つ、`Class` に書き換えるだけで、コードの見栄えが格段に変わるはずです。
何か分からないことがあれば、いつでも聞いてくださいね。エンジニアとしての最初の一歩、心から応援しています。
