4.9 異常終了時の注意
 エクセルオブジェクトを使っているVBS(WSH)のプログラムを実行している途中、バグなどでプログラムが異常終了すると、ちょっとやっかいなことになるときがあります。ここでは、その対処方法についての話です。

 ちなみに、このような現象はAccessなどを使っているときにも起きるので注意しましょう。
ゾンビ?!
 とりあえず、エクセルを例にしてみます。

 下の例を実行すると、@の部分でプログラムが異常終了します。WScript.Slep(5000)が間違っている(正しくはWScript.Sleep(5000))からです。しかし、例ではobjExcel.Visible = Trueでエクセル画面を表示して実行しているので、たとえVBS(WSH)のプログラムが異常終了しても、エクセルのボタンを押して(エクセルを)終了してからやり直しすれば良いのですが、仮にVisible = Falseとしてエクセル画面を表示していないときはどうなるでしょう…。

 エクセルの画面が無いので、終了したくてもそのままでは出来ません。しかし、それよりも、画面に表示されていないために、陰でエクセルが起動たままになっていることに気づかないことの方が恐ろしかったりします。起動したままだとメモリは食うし、何よりもWin9xだとリソース不足でパソコンが不安定になり、やがて再起動するハメにもなりかねません。

 それともう一つ、ワークブックを開いたままこの状態になると、エクセルがワークブックを掴みっぱなしの状態になるので、ワークブックを開いたり更新したりなどにも支障が出ます。

Option Explicit

Dim objExcel

'エクセルオブジェクトを作成します
Set objExcel = CreateObject("Excel.Application")

'エクセル画面を表示します
objExcel.Visible = True

'ワークブックを開きます
objExcel.Workbooks.Open "c:\happy\リスト.xls"

'@5秒待ちます。でもわざと間違えてますが…
WScript.Slep(5000)

'各種の確認ダイアログを非表示
objExcel.DisplayAlerts = False

'エクセルを終了します
objExcel.Quit

'エクセルオブジェクトの破棄
Set objExcel = Nothing
 ※4.8 エクセルの終了と同じ処理です。ただし、わざと間違えてあります。
強制削除ぢゃ!でも、注意してね(汗)
 この状態になると、もはやタスクの強制終了をする以外に手はありません(汗)。しかし、タスクの強制終了は一歩間違うと、取り返しの付かない事態にもなりかねないので、細心の注意が必要です。それと、タスクの強制終了は必ず自己責任の上で行ってください。何があっても、オレは責任を持ちませんので(汗)

 タスクの強制終了は、Win9x系なら[CTRL]+[ALT]+[DEL]でタスクの一覧を出し、エクセルのときならEXCEL、AccessのときならMSACCESSというものを見つけたら強制終了!

 NT、2000、XPなどの場合は、タスクマネージャプロセス一覧から、エクセルのときならEXCEL、AccessのときならMSACCESSというものを見つけ出し強制終了です!

 どちらも同じだけど、間違えて消しちゃいけないヤツを消さないでね(汗)。編集中のワークブックやMDBが、全部パーになったりするので(汁)
そんなわけで
 エクセルやAccessを使うVBS(WSH)のプログラムが異常終了したときは、念のためこのようなゾンビタスクが無いか、必ず確認しましょう!

 それと、多少ウザイですが開発段階ではVisible = Trueとして常に触れるようにしておくのも手です。
Copyright(C) 1999-2006 結城圭介。 All rights reserved