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

わんくま同盟

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

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

■102831 / 3階層)  エクセルのセルの画像化時のエラーについて
□投稿者/ とっちゃん (810回)-(2024/01/13(Sat) 02:51:15)
No102830 (Massa さん) に返信
> ありがとうございます.
>
> ReleaseComObjectについては理解ができていませんでした.

残念ですが、これでは全然足りません。

Excel(WordやPowerPointなどほかのOffice製品も同様)のオートメーションオブジェクトは
細かくインスタンスが分かれているため、「.」をつけてアクセスするオブジェクト(obj.propなら、objの部分)は
ReleaseComObjectを呼び出す必要があります。

そのため、例えば

> Microsoft.Office.Interop.Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(excelPath);

の部分は、
ExcelApp.Workbooks の戻り値もあとで ReleaseComObjectを呼び出す必要があります。
(workbooksを使わないのなら、workbookを取得した直後でReleaseComObjectを呼び出しても問題ない)

ほかにも、ExcelWorkbook.Sheets も解放が必要ですし、sheet.Cells も解放が必要です。


> また,C#での遅延処理は,Sleepなどでしょうか.
>
> 以下のようにプログラムを変更して,
> エラーが出るCopyPictureの周りでSleepを入れたのですが,
> 状況の改善は見られませんでした.
>
こちらですが、魔界の仮面弁士さんがリンクを貼ってくれた記事
https://vba-create.jp/vba-method-copypicture/」にもありますが
DoEvents()(C#なら、Application.DoEvents()) を呼び出して、メッセージを処理する必要があります。

COM(オートメーションや、OLEも含む)のプロセス間通信はWindowsのメッセージも使って処理するため
メッセージを処理できる必要があります。そのため、UIスレッドで動かす必要があるという制約があります。

今回のような場合、ループの最後の ReleaseComObject をやった直後あたりで
Application.DoEvents() などを挟むのが良いと思います。

ただし、このメソッドを呼び出すとメッセージを処理するため副作用が出る可能性があります。
その点も注意が必要です。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: エクセルのセルの画像化時のエラーについて /Massa →Re[4]: エクセルのセルの画像化時のエラーについて /Massa
 
上記関連ツリー

エクセルのセルの画像化時のエラーについて / Massa (24/01/12(Fri) 15:21) #102826
Re[1]: エクセルのセルの画像化時のエラーについて / 魔界の仮面弁士 (24/01/12(Fri) 17:36) #102828
│└ Re[2]: エクセルのセルの画像化時のエラーについて / Massa (24/01/12(Fri) 23:26) #102830
│  └ エクセルのセルの画像化時のエラーについて / とっちゃん (24/01/13(Sat) 02:51) #102831 ←Now
│    └ Re[4]: エクセルのセルの画像化時のエラーについて / Massa (24/01/14(Sun) 08:18) #102834 解決済み
Re[1]: エクセルのセルの画像化時のエラーについて / とっちゃん (24/01/12(Fri) 17:17) #102827
  └ Re[2]: エクセルのセルの画像化時のエラーについて / Massa (24/01/12(Fri) 23:15) #102829

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信