目次
COM_ERR_IGN~COM_ERR_RET間でCOMエラーメッセージを出ないようにします。この間にエラーが発生した場合は、COM_ERR_FLGにTRUEが設定されます。また、COMエラーが発生した箇所でERR_VALUEを返します。
- 構文
- COM_ERR_IGN
//何等かのCOM処理COM_ERR_RET
- 引数
- 戻り値
使い方
以下はインプットボックスに入力されたパスのブックを開くプログラムです。
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
DIM Workbook = Excel.Workbooks.Open(INPUT("開くワークブックのパスを入力"))
PRINT Workbook.ActiveSheet.Name
- 結果
Sheet1
存在するパスが入力された場合はWorkbook オブジェクトの値を取得しますが、存在しない場合はCOMエラーが発生しプログラムが終了します。
COM_Error:例外が発生しました。
例外処理を使って書くと以下のようになります。存在しないパスを指定した場合WorkbookにはEMPTYが代入されEXCEPT句が実行されます。エラーが発生した時点でEXCEPT句に処理が飛ぶのでシート名の出力は行われません。
TRY
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
DIM Workbook = Excel.Workbooks.Open(INPUT("開くブックのパスを入力"))
PRINT Workbook.ActiveSheet.Name
EXCEPT
PRINT "エラーが発生しました。"
ENDTRY
- 結果
エラーが発生しました。
COM_ERR_IGN-COM_ERR_RET内でエラーが発生するとその箇所でERR_VALUEが返されます。
以下の例では存在しないパスを指定した場合、Workbookに代入する箇所でCOMエラーが発生しWorkbookにERR_VALUE代入がされます。IF文でERR_VALUEとの比較を行うことでエラーが発生したかどうかを判定できます。
またこの時点でCOM_ERR_FLGがTRUEになります。
COM_ERR_IGN
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
DIM Workbook = Excel.Workbooks.Open(INPUT("開くワークブックのパスを入力"))
IF Workbook <> ERR_VALUE THEN PRINT Workbook.ActiveSheet.Name
COM_ERR_RET
- 結果
Sheet1
CREATEOLEOBJ("InternetExplorer.Application")は前のプロセスが終了する前に生成すると前のプロセスをしようとしてエラーが発生します。以下はエラーが発生しなくなるまでInternetExplorer オブジェクトを生成し続けるプログラムです。InternetExplorer オブジェクトを生成できなかった場合COM_ERR_FLGにTRUEが設定されループを繰り返すことになります。生成できた場合はCOM_ERR_FLGにFALSEが設定されループを抜けることができます。
REPEAT
COM_ERR_IGN
DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
COM_ERR_RET
UNTIL COM_ERR_FLG = FALSE
IE.Visible = TRUE
COM_ERR_IGN-COM_ERR_RETのCOM_ERR_FLGはメインルーチンが開始した時、COM_ERR_IGNを実行した時にFALSEが代入(初期化)されます。また、エラーが発生した時点でTRUEが代入されます。
COM_ERR_IGN // ここでCOM_ERR_FLGにFALSEを代入(初期化)
// エラーが発生した箇所でCOM_ERR_FLGにTRUEが代入
COM_ERR_RET
// ここでは直前のCOM_ERR_IGNの結果がそのまま残っています
COM_ERR_IGN // ここでCOM_ERR_FLGにFALSEを代入(初期化)
// エラーが発生した箇所でCOM_ERR_FLGにTRUEが代入
COM_ERR_RET
COMエラーの種類
名前が不明です。
存在しないメソッド・プロパティを使用したときに発生します。
IE.Navgate("http://example.com")
COM_Error:名前が不明です。
3行目: IE.Navgate("http://example.com")
クラス文字列が無効です, ProgID: "***"
存在しないクラス文字列を記述したことによるエラー。
プログラム
DIM IE = CREATEOLEOBJ("Internet Explorer.Application")
メッセージ。
COM_Error:クラス文字列が無効です, ProgID: "Internet Explorer.Application"
1行目: DIM IE = CREATEOLEOBJ("Internet Explorer.Application")
RPC サーバーを利用できません。
IE.Quitで閉じたIEを操作しようとしたときに発生します。
IE.Navigate("http://example.com")
COM_Error:RPC サーバーを利用できません。
3行目: IE.Navigate("http://example.com")
OLE error 8150002E, ProgID: "InternetExplorer.Application"
IE.Quitで閉じてプロセスが残っている状態で再度IEを起動すると発生することがあります。
対策としては、コマンドプロンプトでプロセスを終了させる、EXEC関数で起動させるなどがあります。
DOSCMD("TASKKILL /F /IM iexplore.exe")
EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
GETID("Internet Explorer", "IEFrame", -1)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
以下はCOM_ERR_IGNで書く場合。
REPEAT
COM_ERR_IGN
DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
COM_ERR_RET
SLEEP(1.000)
UNTIL !COM_ERR_FLG
IE.Visible = TRUE
IE.Quit
例外が発生しました。
スペルミスやページの読み込みが完了していないときにIE操作をすると発生します。
(メッセージなし)
生成されていないもしくは終了したオブジェクトにアクセスしようとしているなど。
原因がわからない場合は操作している対象のアプリ(OfficeならばVBAに移植するなどし)プログラムを実行するとエラーコードが表示されるので原因を特定するヒントになるかもしれません。
以下はExcelでセル番地が範囲外のためエラーとなっているプログラムの例。0行0列が範囲外なのは数値だと見てわかるが、これが変数でループとかしてるとよくやるミス。
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add()
Excel.Cells(0, 0).Value = 1
以下はUWSCで実行したときのエラー。
以下は同じ動作をするプログラムをExcelに移植したプログラムとエラーメッセージ。
[開発]-[Visual Basic]-[挿入]-[標準モジュール]
Sub main()
Workbooks.Add()
Cells(0, 0).Value = 1
End Sub
UWSCではただエラーとしかわからないが、Excelだとエラーコード1004と表示されます。1004は存在しないファイルを開こうとしたとき、存在しないセルアドレスにアクセスしたとき、という風にエラーの原因を絞ることができます。
管理者権限がないときもこのエラーが発生します。
以下はWshShell.RegDeleteでレジストリを削除しようとしたときのエラー。
使い方
セルが編集状態のためCOMエラーが出て値の入力ができないのを、エラーが出なくなって値が入力できるまでループする処理。
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add
DIM ID = GETID("Excel")
CTRLWIN(ID, ACTIVATE)
KBD(VK_F2, CLICK, 500) // 編集状態にする
REPEAT
FUKIDASI("COM_Error")
COM_ERR_IGN
Excel.Range("A1").Value = 8
COM_ERR_RET
UNTIL !COM_ERR_FLG
FUKIDASI()
SLEEP(3.000)
Excel.Application.DisplayAlerts = FALSE
Excel.Quit