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

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

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

Re[4]: Excelのシェイプを操作するとプロセスが残る


(過去ログ 103 を表示中)

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

■61366 / inTopicNo.1)  Excelのシェイプを操作するとプロセスが残る
  
□投稿者/ kaorin (1回)-(2011/08/10(Wed) 15:59:58)

分類:[C#] 

C#からExcelを開き、Excelシート内に配置されたオートシェイプを操作すると
終了処理してもタスクマネージャーのプロセスに「Excel.EXE」が残ってしまいます。
切り分けした結果、下に示すコードを実行しなければ、Excelの起動 〜 終了は正常に動作し
プロセスにも「Excel.EXE」は残りません。

(起動 〜 終了)← この流れだと○
(起動 〜 オートシェイプ名変更 〜 終了)← この流れだと×

あと何をどのように解放してやればいいのでしょうか?

(耳が痛い質問内容とは重々承知しており、いろんなサイトを見て回りましたが、
解決に至りませんでした申し訳ございませんが宜しくお願い致します)


#region オートシェイプ名変更/void xlsShpCangeName
static public void xlsShpCangeName(Excel.Worksheet ctrlSheet, string ShapeName, string NewShapeName)
  {
    Excel.Shape shp = null;
    shp = ctrlSheet.Shapes.Item(ShapeName);

    // オートシェイプ名変更
    shp.Name = NewShapeName;

    //インスタンスの解放
    Marshal.ReleaseComObject(shp);
    shp = null;
  }
#endregion // void xlsShpCangeName

【環境】
WinXP_SP3
Microsoft Visual Studio 2010 Version 10.0.30319.1
Excel2003

引用返信 編集キー/
■61368 / inTopicNo.2)  Re[1]: Excelのシェイプを操作するとプロセスが残る
□投稿者/ shu (932回)-(2011/08/10(Wed) 16:11:44)
No61366 (kaorin さん) に返信

>     shp = ctrlSheet.Shapes.Item(ShapeName);
ctrlSheet.Shapesを変数にいれといてその変数に対しても
Marshal.ReleaseComObjectをする。
引用返信 編集キー/
■61369 / inTopicNo.3)  Re[2]: Excelのシェイプを操作するとプロセスが残る
□投稿者/ kaorin (2回)-(2011/08/10(Wed) 18:08:26)
> ctrlSheet.Shapesを変数にいれといてその変数に対しても
> Marshal.ReleaseComObjectをする。

早々の回答ありがとうございます。
「ctrlSheet.Shapes」の型は何になるのでしょうか?

Excel.Shape shps = null;
shps = ctrlSheet.Shapes; や shps = (Excel.Shape[])ctrlSheet.Shapes;
shp = shps.Item(ShapeName);

と、やってみてもダメでした。
何度もお手数おかけしますが、宜しくお願い致します。


引用返信 編集キー/
■61370 / inTopicNo.4)  Re[3]: Excelのシェイプを操作するとプロセスが残る
□投稿者/ Azulean (817回)-(2011/08/10(Wed) 18:33:54)
No61369 (kaorin さん) に返信
> 「ctrlSheet.Shapes」の型は何になるのでしょうか?

Shapes という型があるのでは?
http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.worksheet.shapes.aspx
引用返信 編集キー/
■61371 / inTopicNo.5)  Re[4]: Excelのシェイプを操作するとプロセスが残る
□投稿者/ kaorin (3回)-(2011/08/10(Wed) 18:51:32)
> Shapes という型があるのでは?

Azuleanさん、ご指摘ありがとうございました。
Excel.Shape shps = null;を
Excel.Shapes shps = null;に変更すると良くなりました。

shuさん、Azuleanさん、とても素早く丁重に更に的確にご指摘頂きまして
本当に感謝です。
私みたいな素人が再び質問しないように整理した記述文を貼っときます。
どうもありがとうございました。


#region オートシェイプ名変更/void xlsShpCangeName
static public void xlsShpCangeName(Excel.Worksheet ctrlSheet, string ShapeName, string NewShapeName)
  {
    //変数宣言
    Excel.Shape shp = null;
    Excel.Shapes shps = null;
    shps = ctrlSheet.Shapes;
    shp = shps.Item(ShapeName);

    // オートシェイプ名変更
    shp.Name = NewShapeName;

    //インスタンスの解放
    Marshal.ReleaseComObject(shp);
    shp = null;
    Marshal.ReleaseComObject(shps);
    shps = null;
  }
#endregion // void xlsShpCangeName
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -