累計
本日
昨日

COM オブジェクトをインターフェイス型 'Excel._Worksheet' にキャストできません。

ExcelのCOMコンポーネントを利用し.NETのアプリケーションからExcelへデータを出力する機能を作成している途中に、下記の実行時例外が発生した。
failed: System.InvalidCastException : 型 'Excel.WorksheetClass' の COM オブジェクトを
インターフェイス型 'Excel._Worksheet' にキャストできません。
IID '{000208D8-0000-0000-C000-000000000046}' が指定されたインターフェイスの
COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、
この操作に失敗しました: インターフェイスがサポートされていません
(HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。

例外が発生するのは下記の部分である。シートの名前を変更しているだけなのだが、なぜかキャストエラーになってしまう。
よくよく調べてみると、どうもCOMコンポーネントはSTA(シングルスレッドアパートメント)から呼び出さないとうまくゆかないらしい。アプリケーションとExcelアプリケーションのスレッドが異なるため、シートのインスタンスを作ってあとからワークブックに追加するようなことはできないのかと考え、次のように修正すると例外は発生しなくなった。.NETのアプリケーション側でシートを生成するのではなく、Excelのアプリケーション内でワークシートを追加するようにしている。


参考URL
Unable to cast COM object of type 'System.__ComObject' to interface

OLE スレッド モデルの概要としくみ

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/336

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.