C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: EXCELコンポーネントの解放


(過去ログ 22 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■9729 / inTopicNo.1)  EXCELコンポーネントの解放
  
□投稿者/ VBサル (1回)-(2007/11/02(Fri) 19:59:12)

分類:[.NET 全般] 

開発環境:WindowsXP SP2
     Office2003
使用言語:VS2005.NET

初めて質問をさせて頂きます。
様々な掲示板を参考にして、調べてみたのですが解決できませんでした。
現在、VB.NETからEXCELを操作して、表やグラフを作成しています。

「障害現象」
1.1つのBOOKに2つのシートを出力するアプリケーションを実行させます。
2.正常終了し、出来上がったEXCELを確認します。
3.次に1つのBOOKに5つのシートを出力するアプリケーションを実行させます。
  すると、3つめのシートを作成しようとした際に、エラーとなってしまいます。
  デバッグで確認した内容が、poExcelWorksheets配下にあるCountが前回出力した、
  2シートを保持しており、3シートめを作成したときのExceptionのメッセージが
  インデックスが無効です。 (HRESULT からの例外: 0x8002000B (DISP_E_BADINDEX))となってしまいます。
4.使用しているオブジェクトは全て、
System.Runtime.InteropServices.Marshal.ReleaseComObject(aoComObject)の処理にて解放しています。

「実装方法」
同じようなアプリケーションを複数作成しますので、EXCEL操作関連をDLL化しています。
ここでいう、EXCEL操作とは
・EXCELアプリケーションの作成
・EXCELブック、シートの作成
・新しくシートの追加
・グラフ作成  など
上記内容の処理を行っています。

質問1:COMコンポーネントを使用して際の、DLL化はそもそもできるものなのでしょうか?


質問2:様々なサイトで、EXCELコンポーネントの解放には十分注意してコーディングを行うと
あったので、サンプルコードを実行を行ってみると、以下の部分でエラーとなってしまいます。
ここでは、DLL化せずにアプリケーション自身内で定義したオブジェクトに対して操作しています。
なぜでしょうか?

poExcelApplication = New Microsoft.Office.Interop.Excel.Application
poExcelWorkbooks = poExcelApplication.Workbooks
poExcelWorkbook = poExcelWorkbooks.Add
poExcelWorksheets = poExcelWorkbook.Worksheets(1)  ← ここでエラー
poExcelWorksheet = poExcelWorksheets

サンプルコードをそのまま使用してもエラーにしまい、どうすることもできません。
ひょっとすると、私のコーディング方法にまだ問題があるかもしれませんが。


前にも記述しましたが、EXCELコンポーネントの解放は他のサイトでも取り上げられていますが、
解決方法、間違いをご指摘、ご教授をお願い致します。


引用返信 編集キー/
■9890 / inTopicNo.2)  Re[1]: EXCELコンポーネントの解放
□投稿者/ VBサル (2回)-(2007/11/06(Tue) 17:03:58)
No9729 (VBサル さん) に返信
> 開発環境:WindowsXP SP2
>      Office2003
> 使用言語:VS2005.NET
>
> 初めて質問をさせて頂きます。
> 様々な掲示板を参考にして、調べてみたのですが解決できませんでした。
> 現在、VB.NETからEXCELを操作して、表やグラフを作成しています。
>
> 「障害現象」
> 1.1つのBOOKに2つのシートを出力するアプリケーションを実行させます。
> 2.正常終了し、出来上がったEXCELを確認します。
> 3.次に1つのBOOKに5つのシートを出力するアプリケーションを実行させます。
>   すると、3つめのシートを作成しようとした際に、エラーとなってしまいます。
>   デバッグで確認した内容が、poExcelWorksheets配下にあるCountが前回出力した、
>   2シートを保持しており、3シートめを作成したときのExceptionのメッセージが
>   インデックスが無効です。 (HRESULT からの例外: 0x8002000B (DISP_E_BADINDEX))となってしまいます。
> 4.使用しているオブジェクトは全て、
> System.Runtime.InteropServices.Marshal.ReleaseComObject(aoComObject)の処理にて解放しています。
>
> 「実装方法」
> 同じようなアプリケーションを複数作成しますので、EXCEL操作関連をDLL化しています。
> ここでいう、EXCEL操作とは
> ・EXCELアプリケーションの作成
> ・EXCELブック、シートの作成
> ・新しくシートの追加
> ・グラフ作成  など
> 上記内容の処理を行っています。
>
> 質問1:COMコンポーネントを使用して際の、DLL化はそもそもできるものなのでしょうか?
>
>
> 質問2:様々なサイトで、EXCELコンポーネントの解放には十分注意してコーディングを行うと
> あったので、サンプルコードを実行を行ってみると、以下の部分でエラーとなってしまいます。
> ここでは、DLL化せずにアプリケーション自身内で定義したオブジェクトに対して操作しています。
> なぜでしょうか?
>
> poExcelApplication = New Microsoft.Office.Interop.Excel.Application
> poExcelWorkbooks = poExcelApplication.Workbooks
> poExcelWorkbook = poExcelWorkbooks.Add
> poExcelWorksheets = poExcelWorkbook.Worksheets(1)  ← ここでエラー
> poExcelWorksheet = poExcelWorksheets
>
> サンプルコードをそのまま使用してもエラーにしまい、どうすることもできません。
> ひょっとすると、私のコーディング方法にまだ問題があるかもしれませんが。
>
>
> 前にも記述しましたが、EXCELコンポーネントの解放は他のサイトでも取り上げられていますが、
> 解決方法、間違いをご指摘、ご教授をお願い致します。
>
>



参考書・サイトを何度も読み返し、解決致しました。
また、何か不明な点が出てきたらお願いします。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -