COM_ERR_IGN~COM_ERR_RET間でCOMエラーメッセージを出ないようにします。この間にエラーが発生した場合は、COM_ERR_FLGにTRUEが設定されます。また、COMエラーが発生した箇所でERR_VALUEを返します。
- 構文
- COM_ERR_IGN
//何等かのCOM処理COM_ERR_RET
- 引数
- 戻り値
使い方
以下はインプットボックスに入力されたパスのブックを開くプログラムです。
- 結果
存在するパスが入力された場合はWorkbook オブジェクトの値を取得しますが、存在しない場合はCOMエラーが発生しプログラムが終了します。
例外処理を使って書くと以下のようになります。存在しないパスを指定した場合WorkbookにはEMPTYが代入されEXCEPT句が実行されます。エラーが発生した時点でEXCEPT句に処理が飛ぶのでシート名の出力は行われません。
- 結果
COM_ERR_IGN-COM_ERR_RET内でエラーが発生するとその箇所でERR_VALUEが返されます。
以下の例では存在しないパスを指定した場合、Workbookに代入する箇所でCOMエラーが発生しWorkbookにERR_VALUE代入がされます。<ruby>IF文<rt></rt></ruby>でERR_VALUEとの比較を行うことでエラーが発生したかどうかを判定できます。
またこの時点でCOM_ERR_FLGがTRUEになります。
- 結果
CREATEOLEOBJ("InternetExplorer.Application")は前のプロセスが終了する前に生成すると前のプロセスをしようとしてエラーが発生します。以下はエラーが発生しなくなるまでInternetExplorer オブジェクトを生成し続けるプログラムです。InternetExplorer オブジェクトを生成できなかった場合COM_ERR_FLGにTRUEが設定されループを繰り返すことになります。生成できた場合はCOM_ERR_FLGにFALSEが設定されループを抜けることができます。
プログラム実行例
コトバンクで指定した熟語の読みを調べる
4行目のwordに指定した単語の読み方をコトバンクで調べます。
コトバンクに掲載のない単語は取得できません。
COM_ERR_IGN-COM_ERR_RETのCOM_ERR_FLGはメインルーチンが開始した時、COM_ERR_IGNを実行した時にFALSEが代入(初期化)されます。また、エラーが発生した時点でTRUEが代入されます。
COMエラーの種類
名前が不明です。
存在しないメソッド・プロパティを使用したときに発生します。
クラス文字列が無効です, ProgID: "***"
存在しないクラス文字列を記述したことによるエラー。
プログラム
メッセージ。
RPC サーバーを利用できません。
IE.Quitで閉じたIEを操作しようとしたときに発生します。
OLE error 8150002E, ProgID: "InternetExplorer.Application"
IE.Quitで閉じてプロセスが残っている状態で再度IEを起動すると発生することがあります。
対策としては、コマンドプロンプトでプロセスを終了させる、EXEC関数で起動させるなどがあります。
以下はCOM_ERR_IGNで書く場合。
例外が発生しました。
スペルミスやページの読み込みが完了していないときにIE操作をすると発生します。
(メッセージなし)
生成されていないもしくは終了したオブジェクトにアクセスしようとしているなど。
原因がわからない場合は操作している対象のアプリ(OfficeならばVBAに移植するなどし)プログラムを実行するとエラーコードが表示されるので原因を特定するヒントになるかもしれません。
以下はExcelでセル番地が範囲外のためエラーとなっているプログラムの例。0行0列が範囲外なのは数値だと見てわかるが、これが変数でループとかしてるとよくやるミス。
以下はUWSCで実行したときのエラー。
以下は同じ動作をするプログラムをExcelに移植したプログラムとエラーメッセージ。
[開発]-[Visual Basic]-[挿入]-[標準モジュール]
UWSCではただエラーとしかわからないが、Excelだとエラーコード1004と表示されます。1004は存在しないファイルを開こうとしたとき、存在しないセルアドレスにアクセスしたとき、という風にエラーの原因を絞ることができます。
管理者権限がないときもこのエラーが発生します。
以下はWshShell.RegDeleteでレジストリを削除しようとしたときのエラー。
使い方
セルが編集状態のためCOMエラーが出て値の入力ができないのを、エラーが出なくなって値が入力できるまでループする処理。
