こんにちは! VBScriptの世界へようこそ。
業務自動化の現場で「マクロの記録」から一歩抜け出し、いよいよ本格的なWindows Script Host(WSH)の世界に足を踏み入れようとしている君なら、きっと今日のテーマに直面したことがあるはずです。
「別のPCで実行したら、なぜかエラーが出る…」
「古いバージョンと新しいバージョン、両方の環境に対応させたいのに、オブジェクトの生成で一発レッドカード(エラー)を食らってしまう…」
今回は、そんなCOMコンポーネントの闇を華麗に切り抜け、どんな環境でもしなやかに生き残る「堅牢なエラーハンドリングとフォールバック(代替)機構」の極意を伝授します。
ここをクリアすれば、君はもう「VBScriptの初心者」を卒業し、ワンランク上の自動化エンジニアの仲間入りです。さあ、一緒に本質をマスターしていきましょう!
—
1. なぜ `CreateObject` は突然失敗するのか?
VBScriptで外部の機能(Excel操作、ファイルシステム操作、XML解析など)を使うとき、私たちは当たり前のように `CreateObject` を使いますよね。
‘ 例:XMLをいじるためのDOMオブジェクトを作る
Set xmlDoc = CreateObject(“MSXML2.DOMDocument.6.0”)
このコード、君のパソコンでは完璧に動くかもしれません。しかし、「Officeのバージョンが違うPC」「セキュリティが厳しく設定されたサーバー」「クリーンインストールされたばかりの端末」に持っていった途端、容赦なく以下のエラーが襲いかかります。
> エラー 429: オブジェクトはコンポーネントを作成できません。
原因は主にこの3つ:
1. 対象のCOMコンポーネントがレジストリに登録されていない(未インストール)
2. 指定したバージョンが存在しない(例:`6.0` を指定したのに、古い `4.0` しか入っていない)
3. 実行権限の不足
「じゃあ、相手の環境に合わせてコードを書き直さなきゃいけないの?」
……いいえ、プロのエンジニアはそんな泥臭いことはしません。「失敗したら、別の手を使う」というスマートな自動切り替え(フォールバック)をコードに仕込んでおくのです。
—
2. 現場で使える「堅牢なコンストラクター」の全体像
それでは、VBScriptにおける極限のエラーハンドリングと、バージョン違いを吸収するフォールバック処理を実装した「安全なオブジェクト生成関数」のコードを公開します。
そのままコピーして、拡張子 `.vbs` のファイルで保存すればすぐに動作をテストできます。
Option Explicit
‘ メイン処理の実行
Call Main()
Sub Main()
Dim objXML
‘ 【極意】CreateObjectを直接書かず、専用の安全な関数経由で生成する
‘ ここでは最新のMSXML2を狙いつつ、ダメなら古いバージョンにフォールバックさせる
Set objXML = CreateSafeObjectWithFallback( _
Array(“MSXML2.DOMDocument.6.0”, “MSXML2.DOMDocument.4.0”, “Microsoft.XMLDOM”) _
)
If Not objXML Is Nothing Then
WScript.Echo “見事にオブジェクトの生成に成功しました!”
‘ 試しにXMLの骨組みを作ってみる
objXML.async = False
objXML.loadXML “
WScript.Echo “取得結果: ” & objXML.documentElement.selectSingleNode(“//message”).text
Else
WScript.Echo “致命的なエラー: 互換性のあるコンポーネントが一切見つかりませんでした。”
End If
End Sub
‘ ==============================================================================
‘ 関数名: CreateSafeObjectWithFallback
‘ 概要: 複数のProgID候補を順番に試し、最初に生成できたものを返すコンストラクター
‘ 引数: 試行したいProgIDの配列 (Array)
‘ 戻り値: 生成されたCOMオブジェクト (失敗時は Nothing)
‘ ==============================================================================
Function CreateSafeObjectWithFallback(arrProgIDs)
Dim progID
Dim obj
‘ 配列の要素を上から順に試していく(ウォーターフォール方式)
For Each progID In arrProgIDs
‘ VBScriptのエラー捕捉の基本: On Error Resume Next
On Error Resume Next
‘ オブジェクトの生成を試みる
Set obj = CreateObject(progID)
‘ エラー番号(Err.Number)をチェック
If Err.Number = 0 And Not obj Is Nothing Then
‘ — 成功した場合 —
On Error GoTo 0 ‘ エラー監視を即座に戻す(重要!)
WScript.Echo “【成功】コンポーネントの生成に成功しました: ” & progID
Set CreateSafeObjectWithFallback = obj
Exit Function
End If
‘ — 失敗した場合 —
‘ エラーログを記録したり、デバッグ出力をしたりする場所(今回は握りつぶして次へ)
Err.Clear
On Error GoTo 0
Next
‘ すべての候補が全滅した場合
Set CreateSafeObjectWithFallback = Nothing
End Function
—
3. コードのキモを徹底解説!
初心者から一歩進んだ君にこそ知ってほしい、このコードの「プロたる所以」を解説します。
① `On Error Resume Next` の正しい付き合い方
VBScriptには、C#やJavaのようなモダンな `try-catch` 構文がありません。その代わりにあるのが `On Error Resume Next` です。
これは「エラーが起えてもプログラムを止めずに次の行へ進め」という命令です。
ただし、エラー監視をつけっぱなしにするのはバグの温床になります。
コード内にある `On Error GoTo 0` は、「ここから先は通常のエラー監視に戻す(エラーが起きたら即座にスクリプトを止める)」という、いわば安全装置の解除レバーです。この「ONとOFFのセット管理」がライフサイクル管理の基本中の基本です。
② `Err.Number` の厳密な判定
`CreateObject` が失敗したとき、VBScriptのシステム変数 `Err.Number` には、冒頭で触れた `429` などのエラーコードが格納されます。
上記のコードでは、単にエラーがないことだけでなく、`Not obj Is Nothing`(ちゃんとオブジェクト実体がメモリ上に存在するか)までダブルで確認しています。COMの世界では、エラー番号が0であっても極稀に中身が空っぽのゾンビオブジェクトが返ることがあるため、この二重チェックが極限の安定性を生みます。
③ 配列(Array)によるフォールバック戦略
「これダメなら次!」という総当たり戦を配列でシンプルに実現しています。
例えば、XMLパーサーなら:
1. 最新の `MSXML2.DOMDocument.6.0`
2. 少し古い `MSXML2.DOMDocument.4.0`
3. 太古の遺物だが大抵入っている `Microsoft.XMLDOM`
このように優先度順に並べておくことで、PCの環境差異をコード側が自動で吸収してくれるようになります。これが「レジストリ依存の不確実性をコードでねじ伏せる」アプローチです。
—
4. 陥りやすい罠:レジストリ直叩きとの決別
初学者のうちによやりがちなのが、「レジストリをWScript.Shellで直接覗きにいって、キーが存在するか確認してから `CreateObject` する」という力技です。
一見賢そうに見えますが、これは悪手です。
- レジストリのアクセス権限(セキュリティポリシー)で弾かれる
- 32bit/64bitのレジストリリダイレクション問題に引っかかる
- 手間がかかる割に確実性がない
それよりも、今回紹介したように `On Error Resume Next` を盾にして、実際に生成をトライしに行く(Fail-Fast ならぬ Try-and-Catch) 方が、WindowsのCOMアーキテクチャに対して最も素直で確実なアプローチなのです。
—
まとめ:ここをクリアすればVBScriptは怖くない!
今回は、COM通信におけるエラーハンドリングの本質と、環境差異を乗りこなすフォールバック関数について解説しました。
- `CreateObject` は環境によって失敗するのが当たり前と心得よ
- `On Error Resume Next` と `On Error GoTo 0` は必ずペアで使え
- 複数のフォールバック候補を配列で持ち、スマートにリトライせよ
このパターンを身につければ、君が書くVBScriptの堅牢性は劇的に跳ね上がります。現場のどんな厄介な端末で実行しても「エラー知らず」のクールな自動化スクリプトが組めるようになるはずです。
ここをクリアできれば、VBScriptの基礎はもうバッチリですよ!
自信を持って、次の自動化の扉を開いていきましょう。それでは、また次回の極限知見でお会いしましょう!
