COM_ERR_IGN-COM_ERR_RET

本ページには広告が含まれています。

COM_ERR_IGNCOM_ERR_RET間でCOMエラーメッセージを出ないようにします。この間にエラーが発生した場合は、COM_ERR_FLGTRUEが設定されます。また、COMエラーが発生した箇所でERR_VALUEを返します。

構文
COM_ERR_IGN
//何等かのCOM処理
COM_ERR_RET
引数
戻り値

使い方

以下はインプットボックスに入力されたパスのブックを開くプログラムです。

UWSC
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句に処理が飛ぶのでシート名の出力は行われません。

UWSC
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エラーが発生しWorkbookERR_VALUE代入がされます。IF文ERR_VALUEとの比較を行うことでエラーが発生したかどうかを判定できます。

またこの時点でCOM_ERR_FLGTRUEになります。

UWSC
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_FLGTRUEが設定されループを繰り返すことになります。生成できた場合はCOM_ERR_FLGFALSEが設定されループを抜けることができます。

UWSC
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_RETCOM_ERR_FLGはメインルーチンが開始した時、COM_ERR_IGNを実行した時にFALSEが代入(初期化)されます。また、エラーが発生した時点でTRUEが代入されます。

UWSC
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エラーの種類

名前が不明です。

存在しないメソッド・プロパティを使用したときに発生します。

UWSC
IE.Navgate("http://example.com")
UWSC
COM_Error:名前が不明です。
3行目: IE.Navgate("http://example.com")

クラス文字列が無効です, ProgID: "***"

存在しないクラス文字列を記述したことによるエラー。

プログラム

UWSC
DIM IE = CREATEOLEOBJ("Internet Explorer.Application")

メッセージ。

UWSC
COM_Error:クラス文字列が無効です, ProgID: "Internet Explorer.Application"
1行目: DIM IE = CREATEOLEOBJ("Internet Explorer.Application")

RPC サーバーを利用できません。

COM_Error RPC サーバーを利用できません。.png

IE.Quitで閉じたIEを操作しようとしたときに発生します。

UWSC
IE.Navigate("http://example.com")
UWSC
COM_Error:RPC サーバーを利用できません。
3行目: IE.Navigate("http://example.com")

OLE error 8150002E, ProgID: "InternetExplorer.Application"

COM_Error:OLE Error 8150002E, ProgID: "InternetExplorer.Application"

IE.Quitで閉じてプロセスが残っている状態で再度IEを起動すると発生することがあります。

対策としては、コマンドプロンプトでプロセスを終了させる、EXEC関数で起動させるなどがあります。

UWSC
DOSCMD("TASKKILL /F /IM iexplore.exe")
UWSC
EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
GETID("Internet Explorer", "IEFrame", -1)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

以下はCOM_ERR_IGNで書く場合。

UWSC
REPEAT
	COM_ERR_IGN
		DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
	COM_ERR_RET
	SLEEP(1.000)
UNTIL !COM_ERR_FLG
IE.Visible = TRUE
IE.Quit

例外が発生しました。

COM_Error 例外が発生しました。.png

スペルミスやページの読み込みが完了していないときにIE操作をすると発生します。

(メッセージなし)

COM_Error.png

生成されていないもしくは終了したオブジェクトにアクセスしようとしているなど。

原因がわからない場合は操作している対象のアプリ(OfficeならばVBAに移植するなどし)プログラムを実行するとエラーコードが表示されるので原因を特定するヒントになるかもしれません。

以下はExcelでセル番地が範囲外のためエラーとなっているプログラムの例。0行0列が範囲外なのは数値だと見てわかるが、これが変数でループとかしてるとよくやるミス。

UWSC
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add()

Excel.Cells(0, 0).Value = 1

以下はUWSCで実行したときのエラー。

COM_Error Excel_1004_UWSC.png

以下は同じ動作をするプログラムをExcelに移植したプログラムとエラーメッセージ。

[開発]-[Visual Basic]-[挿入]-[標準モジュール]

UWSC
Sub main()
	Workbooks.Add()
	Cells(0, 0).Value = 1
End Sub
COM_Error Visual Basic 実行時エラー 1004.png

UWSCではただエラーとしかわからないが、Excelだとエラーコード1004と表示されます。1004は存在しないファイルを開こうとしたとき、存在しないセルアドレスにアクセスしたとき、という風にエラーの原因を絞ることができます。

管理者権限がないときもこのエラーが発生します。

以下はWshShell.RegDeleteでレジストリを削除しようとしたときのエラー。

Microsoft Visual Basic_実行時エラー-2147024891(80070005).png

使い方

セルが編集状態のためCOMエラーが出て値の入力ができないのを、エラーが出なくなって値が入力できるまでループする処理。

UWSC
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