2012年8月23日木曜日

Task.Existsが役に立たないときのための代替方法

【まえがき】
VBAで実行中のタスクの情報(存在)を知る方法を検索してみると

に記載されているように、Wordにのみ用意されている TaskオブジェクトのExists()メソッドを用いる方法が紹介されているのを見かけます。
しかしながら、実際に使ってみると『実行中のプロセス全てが列挙されるわけではない(*)』という問題や、当たり前ですが『Excelでは使えない』という問題がありました。

というわけで、Task.Exists()の代替策として Excel含めVBAで汎用的に使えような関数を作ってみました。

(*) 何分、だいぶ前に気付いたことなので、どういう状況下でプロセスの取得がうまくいかないのだったか忘れてしまいました。いまいち役に立たない話ですみません。

【やったこと】
プログラムの二重起動を防止したいといった用途で使いたいという背景があったので
  1. WMI (Windows Management Infomation)を使ってプロセス一覧を取得し、
  2. 引数で指定した実行ファイル名に一致するプロセスが存在するか否かをチェックする
ようにしました。
この動作は、Task.Exists() の『引数で指定した文字列にウィンドウのタイトルが一致するか否かをチェックする動作』とは異なっています。もし、下記コードを利用される場合は、この点ご注意ください。


余談ですが、WMIの使い方に関しては、VBAに限らず、VB6.0やVBSのサンプルコードが参考になります。(大抵は、ほぼそのまま流用可能です。)