【入門編】【HTAリッチエラーダイアログ】On Error 発生時にHTML Application(.hta)を動的作成して詳細スタックを表示する手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:致命的なエラーを「美しく」処理するHTA動的生成テクニック

こんにちは。現場で泥臭い自動化と格闘し続ける諸君、ようこそ。

VBScriptで最も恐ろしいのは、エラー発生時に「何か起きた」ことしか分からず、真っ暗な画面で途方に暮れることではないでしょうか。標準の `MsgBox` は、デバッグにはあまりに力不足です。

今日は、「VBScriptでエラーが発生した瞬間、HTML Application (HTA) をその場で生成し、リッチなエラー画面を表示する」という、伝説のエンジニアたちが密かに使っているテクニックを伝授します。

なぜ、ただのメッセージボックスではダメなのか?

初学者の頃は `On Error Resume Next` でエラーを握りつぶして終わらせがちです。しかし、それでは「なぜ動かないのか」という真実が永久に闇の中です。

今回紹介する手法は、「エラー発生時にHTMLを生成し、ウィンドウとして立ち上げる」というものです。これを使えば、スタックトレースや、ログのクリップボード保存、さらには開発者へのメール送信ボタンまで実装可能になります。

魔法のコード:HTA動的エラーハンドラー

以下のコードを、あなたの既存のVBScriptの末尾に組み込んでみてください。

‘ — エラー発生時のデモ —
On Error Resume Next
Err.Raise 9, “MainModule”, “配列のインデックスが範囲外です。” ‘ わざとエラーを発生させる

If Err.Number <> 0 Then
Call ShowRichError(Err)
End If

‘ — ここからが伝説の関数 —
Sub ShowRichError(errObj)
Dim fso, shell, tempPath, htaFile, htmlContent
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)

‘ 一時フォルダにHTAを生成
tempPath = fso.GetSpecialFolder(2) & “\error_report.hta”

‘ HTML/CSS/JS を含んだHTAの構造
htmlContent = “致命的なエラーが発生しました” & _
” & _

” & _

スポンサーリンク

エラー詳細

” & _
コード: ” & errObj.Number & “
” & _
発生源: ” & errObj.Source & “
” & _
内容: ” & errObj.Description & “

” & _

‘ ファイル書き出し
Set htaFile = fso.CreateTextFile(tempPath, True)
htaFile.Write htmlContent
htaFile.Close

‘ HTAをウィンドウとして起動
shell.Run “mshta.exe “”” & tempPath & “”””, 1, True

‘ 後始末
fso.DeleteFile tempPath
WScript.Quit
End Sub

コードの深層解説:なぜこれで動くのか?

このコードには、VBScriptの「基本」と「裏技」が詰まっています。

1. `On Error Resume Next` の正しい使い方
エラーを無視するのではなく、「エラーが発生した状態を維持する」ために使います。発生直後に `Err` オブジェクトをチェックするのが鉄則です。
2. `mshta.exe` の活用
`mshta.exe` は、HTMLファイルをアプリケーションとして実行するWindows標準の実行環境です。これを使うことで、VBScript単体では不可能な「グラフィカルなUI」が実現できます。
3. ライフサイクルの管理
一時的にファイルを作成し、終了時に `DeleteFile` で消去する。この「汚さない」という意識こそが、プロの自動化エンジニアの嗜みです。

初学者が陥りやすい罠と解決策

  • 「HTAが起動しない」場合

環境によってはセキュリティポリシーで `mshta.exe` が制限されていることがあります。まずは手動で、生成された `.hta` ファイルをダブルクリックして開けるか確認してください。

  • 「日本語が文字化けする」場合

`CreateTextFile` でファイルを書き出す際、デフォルトではANSIになります。もしUnicodeの文字列を扱う場合は、`fso.CreateTextFile(path, True, True)` と第3引数に `True` を指定することで、UTF-16として書き出せます。

さあ、次のステップへ

このHTA生成手法をマスターすれば、あなたのスクリプトは単なる「コマンドの羅列」から、「堅牢なアプリケーション」へと進化します。

「エラーは悪いことではない。エラーはプログラムが語りかけてくる対話である」。そう捉えられるようになった時、あなたはもう初心者ではありません。

次は、このHTAの中に「エラーログをテキストファイルに書き出すボタン」を追加してみてください。それができれば、現場の運用担当者は涙を流して喜ぶはずですよ。

それでは、また次回の深淵でお会いしましょう。健闘を祈ります!

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